使用scrapy抓取多页内容


前言

前面已经实现了模拟登陆,以及爬取单页数据和照片并保存,那么如果要爬取多页内容该如何实现呢?


scrapy发送翻页请求

学习目标:

  1. 应用 完善并使用Item数据类
  2. 应用 构造Request对象,并发送请求

1 翻页请求的思路

使用requests模块实现翻页请求的:

  1. 找到下一页的URL地址
  2. 调用requests.get(url)

scrapy实现翻页的思路:

  1. 找到下一页的url地址
  2. 构造url地址的请求,传递给引擎

2 scrapy实现翻页请求

2.1实现方法
  1. 确定url地址
  2. 构造请求,scrapy.Request(url,callback)
    callback:指定解析函数名称,表示该请求返回的响应使用哪一个函数进行解析
  3. 把请求交给引擎:yield scrapy.Request(url,callback)
2.2 某段子网站

通过爬取段子页面的信息,学习如何实现翻页请求

思路分析
  1. 获取首页的数据
  2. 寻找下一页的地址,进行翻页,获取数据

注意:
在settings中设置User-Agent:

DEFAULT_REQUEST_HEADERS = {
   "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
   "Accept-Language": "en",
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
}
2.3 代码实现
  • 在dz.py中实现
import scrapy
from duanzi.items import DuanziItem

class DzSpider(scrapy.Spider):
    name = "dz"
    allowed_domains = ["抓取的网站域名"]
    start_urls = ["抓取的起始网站"]

    def parse(self, response, **kwargs):
    	# 网站的多页urlguilv
        url = '使用与网页多页url有规律的url'
        for i in range(1, 11):
            new_url = url%i
            yield scrapy.Request(new_url, callback=self.parse_detail)

    def parse_detail(self, response, **kwargs):
        """
        解析页面详细提取数据的方法
        """
        # print(response.text)
        article_list = response.xpath('//article[@class="excerpt"]')
        for article in article_list:
            item = DuanziItem()
            title = article.xpath('./header/h2/a/text()').extract_first()
            con = article.xpath('./p[@class="note"]/text()').extract_first()
            # print(response.url, title, con)
            item['title'] = title
            item['con'] = con
            print(item)
            yield item

  • 在items.py中实现
import scrapy


class DuanziItem(scrapy.Item):
    # define the fields for your item here like:
    title = scrapy.Field()
    con = scrapy.Field()
2.4 scrapy.Request的更多参数
scrapy.Request(url[,callback,method="GET",headers,body,cookies, 
meta,dont_filter=False])
参数解释
  1. 中括号中的参数为可选参数
  2. callback:表示当前的url的响应交给哪个函数去处理
  3. meta:实现数据在不同的解析函数中传递,meta默认带有部分数据,比如下载延迟,请求深度等
  4. dont_filter:默认为False,会过滤请求的url地址,即请求过的url地址不会继续被请求,对需要重复请求的url地址可以把它设置为Ture,比如贴吧的翻页请求,页面的数据总是在变化;start_urls中的地址会被反复请求,否则程序不会启动
  5. method:指定POST或GET请求
  6. headers:接收一个字典,其中不包括cookies
  7. cookies:接收一个字典,专门放置cookies
  8. body:接收一个字典,为POST的数据
2.5 结果展示

在这里插入图片描述

总结

  1. 完善并使用Item数据类:
    1. 在items.py中完善要爬取的字段
    2. 在爬虫文件中先导入Item
    3. 实力化Item对象后,像字典一样直接使用
  2. 构造Request对象,并发送请求:
    1. 导入scrapy.Request类
    2. 在解析函数中提取url
    3. yield scrapy.Request(url, callback=self.parse_detail, meta={})
  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy是一个强大的Python框架,用于抓取和提取数据。它支持多层抓取数据的功能,使得我们能够轻松地在网站的不同页面上抓取相关的数据。 在Scrapy中,我们可以使用多个Spider来实现多层抓取。每个Spider负责从特定的页面中抓取数据,并可以定义其将要跟进的链接。通过这种方式,我们可以在不同层级上迭代地抓取数据。 首先,我们需要定义一个Spider,用于抓取初始页面的数据。在这个Spider中,我们可以使用XPath或CSS选择器来定位并提取我们想要的数据。同时,我们还需要定义将要跟进的链接,并将其添加到抓取队列中。 接下来,当Spider开始抓取数据时,它将会解析初始页面,并跟进我们定义的链接。在跟进的页面上,我们可以再次使用XPath或CSS选择器来提取更多的数据,并将要跟进的链接添加到抓取队列中。 通过这种方式,Spider可以在多个层级上迭代地抓取数据。我们可以根据需要定义多个Spider,并使用Scrapy的调度器来管理它们的抓取顺序。这样,我们就能够高效地抓取和提取出我们想要的数据。 总而言之,Scrapy是一个强大的框架,可以通过多层抓取来提取我们需要的数据。使用Scrapy,我们可以轻松地定义和管理多个Spider,并在不同层级上迭代地抓取数据。这使得我们能够更加高效和灵活地进行数据抓取和提取的工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值