【发布时间】:2019-01-10 09:30:35
【问题描述】:
我有一个启动两个页面的刮板 - 其中一个是主页,另一个是一个 .js 文件,其中包含我需要提取的经纬度坐标,因为稍后在解析过程中需要它们。我想首先处理 .js 文件,提取坐标,然后解析主页并开始抓取其链接/解析其项目。
为此,我在Request 方法中使用了priority 参数,我说我希望首先处理我的.js 页面。这有效,但只有大约 70% 的时间(一定是由于 Scrapy 的异步请求)。其余 30% 的时间我最终都在我的 parse 方法中尝试解析 .js 长/纬度坐标,但是已经通过了主网站页面,因此无法解析它们。
出于这个原因,我尝试以这种方式修复它:
在 parse() 方法中,检查第 n 个 url 是哪个,如果它是第一个而不是 .js 的,则重新启动蜘蛛。但是,当我下次重新启动蜘蛛时,它首先正确传递了 .js,但在其处理之后,蜘蛛完成工作并退出脚本而没有错误,就好像它已完成一样。
为什么会发生这种情况,我重新启动蜘蛛时页面的处理与我刚启动它时有什么不同,我该如何解决这个问题?
这是我在尝试调试正在执行的内容以及重新启动时停止的原因时在两种情况下都有示例输出的代码。
class QuotesSpider(Spider):
name = "bot"
url_id = 0
home_url = 'https://website.com'
longitude = None
latitude = None
def __init__(self, cat=None):
self.cat = cat.replace("-", " ")
def start_requests(self):
print ("Starting spider")
self.start_urls = [
self.home_url,
self.home_url+'js-file-with-long-lat.js'
]
for priority, url in enumerate(self.start_urls):
print ("Processing", url)
yield Request(url=url, priority=priority, callback=self.parse)
def parse(self, response):
print ("Inside parse")
if self.url_id == 0 and response.url == self.home_url:
self.alert("Loaded main page before long/lat page, restarting", False)
for _ in self.start_requests():
yield _
else:
print ("Everything is good, url id is", str(self.url_id))
self.url_id +=1
if self.longitude is None:
for _ in self.parse_long_lat(response):
yield _
else:
print ("Calling parse cats")
for cat in self.parse_cats(response):
yield cat
def parse_long_lat(self, response):
print ("called long lat")
try:
self.latitude = re.search('latitude:(\-?[0-9]{1,2}\.?[0-9]*)',
response.text).group(1)
self.longitude = re.search('longitude:(\-?[0-9]{1,3}\.?[0-9]*)',
response.text).group(1)
print ("Extracted coords")
yield None
except AttributeError as e:
self.alert("\nCan't extract lat/long coordinates, store availability will not be parsed. ", False)
yield None
def parse_cats(self, response):
pass
""" Parsing links code goes here """
蜘蛛正确启动时的输出,首先获取 .js 页面,然后开始解析猫:
Starting spider
https://website.com
https://website.com/js-file-with-long-lat.js
Inside parse
Everything is good, url id is 0
called long lat
Extracted coords
Inside parse
Everything is good, url id is 1
Calling parse cats
脚本继续并解析一切正常。 蜘蛛启动不正确时输出,首先获取主页并重新启动start_requests():
Starting spider
https://website.com
https://website.com/js-file-with-long-lat.js
Inside parse
Loaded main page before long/lat page, restarting
Starting spider
https://website.com
https://website.com/js-file-with-long-lat.js
Inside parse
Everything is good, url id is 0
called long lat
Extracted coords
脚本停止执行,没有错误,就好像它已经完成一样。
附:如果这很重要,我确实提到 start_requests() 中的处理 URL 是按相反的顺序处理的,但是由于循环顺序,我发现这很自然,我希望 priority 参数能够完成它的工作(因为它在大多数情况下都是如此)时间,它应该按照 Scrapy 的文档去做)。
【问题讨论】:
标签: python python-3.x scrapy generator scrapy-spider