scrapy手动发送请求
scrapy手动发送请求
要求:使用scrapy手动发送请求实现数据爬取。
爬虫文件parse()方法中通过yield scrapy.Requests()来进行手动发请求:
- yield scrapy.Request(url,callback) :GET请求 callback指定解析函数,用于解析数据。
- yield scrapy.FormRequest(url,callback,formdata) : POST请求 formdate字典类型请求参数。
为什么start_urls列表中的url会被自动进行get请求的发送?
因为爬虫父类scrapy.Spider类中start_requests()方法调用了start_urls列表中元素。
# 父类方法:该方法的原始实现 def start_requests(self): for u in self.start_urls: yield scrapy.Request(url=u, callback=self.parse)
如何将start_urls中的url默认进行post请求的发送?
重写start_requests()方法
def start_requests(self): for u in self.start_urls: yield scrapy.FormRequest(url=u, callback=self.parse)
示例
需求:将段子王中前5页码对应的数据进行爬取。
spiders目录中的xxx.py
import scrapy from handRegPro.items import HandregproItem class DuanziSpider(scrapy.Spider): name = 'duanzi' # allowed_domains = ['www.xxx.com'] start_urls = ["https://duanzixing.com/"] # 通用的url模板 url = "https://duanzixing.com/page/%d/" page_num = 2 # 将段子王中所有页码对应的数据进行爬取 def parse(self, response): article_list = response.xpath('/html/body/section/div/div/article') for article in article_list: title = article.xpath('./header/h2/a/text()').extract_first() content = article.xpath('./p[2]/text()').extract_first() item = HandregproItem() item['title'] = title item['content'] = content yield item if self.page_num < 5: # 结束递归的条件,这里只爬取前4页内容 new_url = format(self.url % self.page_num) # 其它页面对应的完整url self.page_num += 1 # 对新的页码对应的url进行请求发送(手动发送GET请求) yield scrapy.Request(url=new_url, callback=self.parse) # callback回调函数自己调自己