Scrapy 入门_实战糗事百科段子
1.爬虫需求及效果
爬取糗事百科段子 写入本地 txt 文件。
爬取效果
2.Scrapy项目搭建
# 新建项目
scrapy startproject qiushibaike
cd qiushibaike
# 构建爬虫文件
scrapy gensipder qiu qiushibaike.com
项目结构如下:
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再试试。
在setting.py 文件中 配置 USER_AGENT,再次尝试。
数据正常获取,成功获取到 糗事百科的段子数据。
2.2 自定义实现 UserAgent 中间件
上面通过 在setting 中配置 USER_AGENT 的方式 突破了 糗事百科的爬虫封锁,那么它的实现原理是什么呢?
当在 setting 中配置了 USER_AGENT 实际上启用了 scrapy自身的user-agent中间件 UserAgentMiddleware
,默认从 setting 文件中读取 USER_AGENT
在 middlewares 目录下 新建randomUserAgent.py,自定义 随机User-agent 类
禁用 scrapy 默认的 user-agent 中间件,启用自定义的 中间件。
爬取效果
2.3 使用代理池请求
首先要用到 前面写的 爬取 快代理 的免费代理ip 的代码 获取到可用的代理IP,写入proxyPool.py 文件
定义随机代理 类
启用自定义Ip代理中间件,并把默认的代理中间件的优先级 调在 自定义的之后。
运行效果
评论区