目 录CONTENT

文章目录

Scrapy 入门_实战糗事百科段子

小张的探险日记
2021-09-07 / 0 评论 / 0 点赞 / 596 阅读 / 1,586 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-12-29,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Scrapy 入门_实战糗事百科段子

1.爬虫需求及效果

​ 爬取糗事百科段子 写入本地 txt 文件。

image-20210531001534557

​ 爬取效果

image-20210531002123369

2.Scrapy项目搭建

# 新建项目
scrapy startproject qiushibaike
cd qiushibaike
# 构建爬虫文件
scrapy gensipder qiu qiushibaike.com

项目结构如下:

image-20210531001942481

2.1 糗事百科反扒分析

爬虫文件,使用 通用爬虫 CrawlSpider,并通过 rules 提取 分页数据,最后通过 xpath 选择器 提取数据

​ username : 用户名称

​ content : 发布的内容

​ laughableCount : 好笑数

​ commentCount: 评论数

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor


class QiuSpider(CrawlSpider):
    name = 'qiu'
    allowed_domains = ['qiushibaike.com']
    start_urls = ['https://www.qiushibaike.com/text/']

    # 提取有规律的链接
    rules = (
        Rule(LinkExtractor(allow=r'.*/text/page/\d{1,2}/$'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        divlist = response.css('.col1 > div')
        for item in divlist:
                yield {
                    'username' : item.xpath('.//div[1]/a[2]/h2/text()').get().strip(),
                    'content' : item.xpath('.//a[1]/div/span/text()').get().strip(),
                    'laughableCount' : item.xpath('.//div[2]/span[1]/i/text()').get().strip(),
                    'commentCount' : item.xpath('.//div[2]/span[2]/a/i/text()').get().strip()
                }

​ 直接爬取会出现

​ twisted.web._newclient.ResponseNeverReceived: [<twisted.python.failure.Failure twisted.internet.error.ConnectionDone: Connection was closed cleanly.>]

​ 说明网站具有一定的反扒策略,尝试加 USER_AGENT再试试。

image-20210531002608480

​ 在setting.py 文件中 配置 USER_AGENT,再次尝试。

image-20210531002736556

数据正常获取,成功获取到 糗事百科的段子数据。

image-20210531002820671

2.2 自定义实现 UserAgent 中间件

​ 上面通过 在setting 中配置 USER_AGENT 的方式 突破了 糗事百科的爬虫封锁,那么它的实现原理是什么呢?

当在 setting 中配置了 USER_AGENT 实际上启用了 scrapy自身的user-agent中间件 UserAgentMiddleware

​ ,默认从 setting 文件中读取 USER_AGENT

image-20210531231931934

在 middlewares 目录下 新建randomUserAgent.py,自定义 随机User-agent 类

image-20210531235927928

​ 禁用 scrapy 默认的 user-agent 中间件,启用自定义的 中间件。

image-20210601000429389

爬取效果

image-20210531235902243

2.3 使用代理池请求

​ 首先要用到 前面写的 爬取 快代理 的免费代理ip 的代码 获取到可用的代理IP,写入proxyPool.py 文件

image-20210602000929638

​ 定义随机代理 类

image-20210602001008994

​ 启用自定义Ip代理中间件,并把默认的代理中间件的优先级 调在 自定义的之后。

image-20210602001042641

​ 运行效果

image-20210602001144759

0

评论区