python - Scraper 卡在请求循环中
问题描述
所以我正在尝试构建一个非常基本的抓取工具,它从我的服务器中提取信息,使用该信息创建一个链接,然后生成一个请求,在解析之后,它从解析的页面中抓取一个链接,将其上传回服务器使用获取请求。我遇到的问题是它会从服务器中提取信息,创建一个链接,然后产生请求,并且根据那里的响应时间(这是不可靠的一致),它将转储并重新开始另一个 get 请求服务器。我的服务器逻辑的设计方式是它正在提取下一个需要处理的数据集,并且在使用该数据集决定采取行动之前,它将不断尝试提取并解析它。我对scrapy还很陌生,需要帮助。我知道我的代码是错误的,但我没有
name = "scrapelevelone"
start_urls = []
def start_requests(self):
print("Start Requests is initiatied")
while True:
print("Were looping")
r = requests.get('serverlink.com')
print("Sent request")
pprint(r.text)
print("This is the request response text")
print("Now try to create json object: ")
try:
personObject = json.loads(r.text)
print("Made json object: ")
pprint(personObject)
info = "streetaddress=" + '+'.join(personObject['address1'].split(" ")) + "&citystatezip=" + '+'.join(personObject['city'].split(" ")) + ",%20" + personObject['state'] + "%20" + personObject['postalcodeextended']
nextPage = "https://www.webpage.com/?" + info
print("Creating info")
newRequest = scrapy.Request(nextPage, self.parse)
newRequest.meta['item'] = personObject
print("Yielding request")
yield newRequest
except Exception:
print("Reach JSON exception")
time.sleep(10)
每次调用 parse 函数时,它都会执行所有逻辑,最后创建一个 request.get 语句,它应该向服务器发送数据。如果它走到尽头,这一切都会做。我尝试了很多不同的方法来尝试让爬虫循环并不断向服务器请求更多信息。我希望刮板无限期地运行,但是当我无法离开计算机时,这会破坏目的,因为它会因请求而窒息。有什么建议可以在不使用 start_requests 函数中的愚蠢 while 循环的情况下保持刮板 24/7 运行?最重要的是,谁能告诉我为什么它会卡在请求循环中?:(我非常头疼试图解决这个问题,最后屈服于一个论坛......
解决方案
你应该做的是从你的服务器 url 开始,并通过产生 Request 对象不断地重试它。如果您拥有的数据是新的,则解析它并安排您的请求:
class MyCrawler:
start_urls = ['http://myserver.com']
past_data = None
def parse(self, response):
data = json.loads(response.body_as_unicode())
if data == past_data: # if data is the same, retry
# time.sleep(10) # you can add delay but sleep will stop everything
yield Request(response.url, dont_filter=True, priority=-100)
return
past_data = data
for url in data['urls']:
yield Request(url, self.parse_url)
# keep retrying
yield Request(response.url, dont_filter=True, priority=-100)
def parse_url(self, repsonse):
#...
yield {'scrapy': 'item'}
推荐阅读
- python - 当我尝试导入 facebook 先知时:pip install fbprophet ...我总是收到此错误
- javascript - Google Cloud Vision API 文本检测检测错误语言
- postgresql - 堆栈生成器没有响应
- assembly - 我对在汇编语言中使用 div 函数的这段代码感到困惑
- angular - Angular 和 ng-image-slider - 一次只显示一张图片
- amazon-web-services - 如何解决 beanstalk 中的 HTTP ERROR 500?
- java - java.lang.RuntimeException: java.lang.RuntimeException: java.io.IOException: com.android.ide.common.process.ProcessException 在 android studio
- apache-flink - 在 Flink 运算符中读取外部文件(如图像)的最佳解决方案是什么?
- java - Junit5测试无法注入依赖但正常运行的应用程序可以注入它
- azure - Azure Pipelines:比较两个日期之间的测试结果