网络编程
位置:首页>> 网络编程>> Python编程>> 如何向scrapy中的spider传递参数的几种方法

如何向scrapy中的spider传递参数的几种方法

作者:bluespacezero  发布时间:2021-12-16 20:04:48 

标签:scrapy,spider,传递参数

有时需要根据项目的实际需求向spider传递参数以控制spider的行为,比如说,根据用户提交的url来控制spider爬取的网站。在这种情况下,可以使用两种方法向spider传递参数。

第一种方法,在命令行用crawl控制spider爬取的时候,加上-a选项,例如:


scrapy crawl myspider -a category=electronics

然后在spider里这样写:


import scrapy

class MySpider(scrapy.Spider):
 name = 'myspider'

def __init__(self, category=None, *args, **kwargs):
   super(MySpider, self).__init__(*args, **kwargs)
   self.start_urls = ['http://www.example.com/categories/%s' % category]
   # ...

也就是在spider的构造函数里加上带入的参数即可。

第二种方法,在用scrapyd控制spider的时候,可以向schedule.json发送-d选项加入参数,同样的,也需要在spider的构造函数里如上写法。例如:


$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1

另外,如果需要在scrapy发出的request上加入参数,可以使用request的meta参数,然后就可以相应的在返回的respose对象中获得传入的参数。这在某些情况下相当有用,比如说需要确定这个url是哪个用户请求爬取的,可以先用上面两种方法之一将信息传递给spider,spider就可以把这个信息加入到request中,然后在相应的reponse中就可以将这个信息与从url的页面中获得的信息一起存入数据库。例如:


def parse_page1(self, response):
 item = MyItem()
 item['main_url'] = response.url
 request = scrapy.Request("http://www.example.com/some_page.html",
              callback=self.parse_page2)
 request.meta['item'] = item
 return request

def parse_page2(self, response):
 item = response.meta['item']
 item['other_url'] = response.url
 return item

来源:https://blog.csdn.net/Q_AN1314/article/details/50748700

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com