因此,我正在尝试构建一个非常基本的抓取器,该抓取器从服务器中提取信息,并使用该信息创建一个链接,然后产生一个请求,然后在解析后从解析的页面中获取单个链接并上传使用获取请求将其返回服务器。我遇到的问题是它将从服务器提取信息,创建链接,然后产生请求,并且根据那里的响应时间(不一致地保持一致),它将转储并从另一个get请求重新开始服务器。我的服务器逻辑的设计方式是,它提取需要处理的下一个数据集,直到对该数据集决定采取行动之前,它将不断尝试提取并解析它。我是新手,需要协助。我知道我的代码是错误的,但是在不更改大量服务器代码和造成不必要麻烦的情况下,我无法提出另一种方法,而且我对scrapy或python并不精明 我的开始请求方法:
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运行?最重要的是,谁能告诉我为什么它陷入请求循环中? :(我试图解决这个问题感到非常头痛,最终屈服于一个论坛...
答案 0 :(得分:1)
您应该做的是从服务器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'}