Python中Scrapy框架如何获取原始的start_url?
Scrapy爬虫时,由于重定向或是其他原因,会导致原始的start_url发生改变,怎样才能得到原始的start_url?
def start_requests(self):
start_url = 'your_scrapy_start_url'
yield Request(start_url, self.parse)
def parse(self, response):
item = YourItem()
item[‘start_url’] = 原始请求的 start_url
yield item
Python中Scrapy框架如何获取原始的start_url?
在Scrapy里,获取原始的 start_urls 列表其实很简单。你可以在Spider的 __init__ 方法里直接访问 self.start_urls,或者通过 start_requests 方法间接拿到。
最直接的方法就是在你的Spider类里直接引用它。比如:
import scrapy
class MySpider(scrapy.Spider):
name = 'my_spider'
start_urls = ['http://example.com/page1', 'http://example.com/page2']
def parse(self, response):
# 在这里,self.start_urls 就是原始的列表
for url in self.start_urls:
self.logger.info(f'Start URL: {url}')
# ... 你的解析逻辑
如果你重写了 start_requests 方法,需要自己构造Request,同样可以访问 self.start_urls:
import scrapy
class MySpider(scrapy.Srapy.Spider):
name = 'my_spider'
start_urls = ['http://example.com/page1', 'http://example.com/page2']
def start_requests(self):
# 在重写的方法里,self.start_urls 依然可用
self.logger.info(f'Starting with URLs: {self.start_urls}')
for url in self.start_urls:
yield scrapy.Request(url, callback=self.parse)
def parse(self, response):
# 解析逻辑
pass
关键点就一个:start_urls 是定义在Spider类上的一个属性,在Spider实例的任何方法中,通过 self.start_urls 都能拿到它。
总结:直接在Spider实例方法里用 self.start_urls 访问。
Scrapy 爬虫常见问题总结 : http://www.revotu.com/scrapy-reptile-faq.html
利用 Request 中的 meta 参数传递信息
def start_requests(self):
start_url = ‘your_scrapy_start_url’
yield Request(start_url, self.parse, meta={‘start_url’:start_url})
def parse(self, response):
item = YourItem()
item[‘start_url’] = response.meta[‘start_url’]
yield item
response.request.url

