欢迎来到赛兔子家园

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回调函数自己调自己

 

posted on 2021-07-22 21:51  赛兔子  阅读(116)  评论(0编辑  收藏  举报

导航