爬取糗事百科,应该没有人比我专业了!我爬了不下上千变!
完整代码在Github,如有需要可自行下载。
GIthub地址:源码地址
一. 爬取前的准备
糗事百科官网:百度即可
段子网址:百度即可
关于解析html博主选择的方法是使用xpath,如有不懂的同学,可看下面两个表格。如果想要深入学习xpath的相关知识可点击博主给的官方
文档的链接进行学习,博主在此声明是为了让读者们能够理解解析式的具体含义。
官网网址:https://lxml.de/tutorial.html
1.1 查看网页
根据上图标记部分可以看到我们主要的要点如下。
- 整体部分
- 作者名称
- 文本内容
- 标签翻页
1.2 标签分析
- 1. 首先我们需要知道我们爬取的所有内容所在标签
通过查看开发者选项,发现<div class ="coll old-style-coll">这个标签对应的正是所有内容的整体存放位置,那么我们也可知道之后的所有内容都是从此标签的子标签内提取得到。
分析一番后,我们可以得到获取所有文本内容的解析式如下:
//div[@class = 'col1 old-style-col1']/div 1
- 2. 作者名称所在位置
由上图我们可以看到作者的位置在<h2></h2>这个标签中。
分析一番后,我们可以得到获取作者的解析式如下:
.//h2//text() 1
- 3. 作者名称所在位置
由上图我们可以看到段子的位置在<div class ="content"></div>这个标签中。
分析一番后,我们可以得到获取段子的解析式如下:
.//div[@class='content']//text()
- 4. 标签翻页
二. 项目的具体实现
2.1 新建爬虫项目qsbk
2.2 settings设置
在创建完成一个scrapy项目后,需要对settings进行一些修改
此处默认为True,需要修改为False。否则无法爬取内容。
取消此部分的注解并添加请求头,伪装自己的身份。
2.3 分别提取出作者和文本内容
- 1. 查看其类型
duanzidivs = response.xpath("//div[@class = 'col1 old-style-col1']/div")print("=")print(type(duanzidivs))print("=") 1234
通过运行我们可以发现其为SelectorList类型
- 2. 通过循环遍历分别打印出作者和文本内容
for duanzidiv in duanzidivs:# strip() 去除前后的空白字符author = duanzidiv.xpath(".//h2//text()").get().strip()content = duanzidiv.xpath(".//div[@class='content']//text()").getall()content = "".join(content).strip()print(author)print(content)
2.4 通过pipeline保存数据
- 前提准备:放开ITEM_PIPELINES的限制
- 1. 第一种方式
class QsbkPipeline:def __init__(self):self.fp = open("duanzi.json","w",encoding="utf-8")def open_spider(self,spider):print('爬虫开始了 ...')def process_item(self, item, spider):item_json = json.dumps(dict(item),ensure_ascii=False)self.fp.write(item_json+'\n')return itemdef close_spider(self,spider):self.fp.close()print('爬虫结束了 ...')
运行结果:
- 2. 第二种方式:数据量少时使用JsonItemExporter
from scrapy.exporters import JsonItemExporter class QsbkPipeline:def __init__(self):self.fp = open("duanzi.json","wb")self.exporter = JsonItemExporter(self.fp,ensure_ascii=False,encoding='utf-8')self.exporter.start_exporting()def open_spider(self,spider):print('爬虫开始了 ...')def process_item(self, item, spider):self.exporter.export_item(item)return itemdef close_spider(self,spider):self.exporter.finish_exporting()self.fp.close()print('爬虫结束了 ...')
运行结果:
- 3. 第三种方式:数据量多使用JsonLinesItemExporter
from scrapy.exporters import JsonLinesItemExporter class QsbkPipeline:def __init__(self):self.fp = open("duanzi.json","wb")self.exporter = JsonLinesItemExporter(self.fp,ensure_ascii=False,encoding='utf-8')self.exporter.start_exporting()def open_spider(self,spider):print('爬虫开始了 ...')def process_item(self, item, spider):self.exporter.export_item(item)return itemdef close_spider(self,spider):self.fp.close()print('爬虫结束了 ...')
运行结果:
2.5 定义Item
在scrapy中不是说不能直接定义返回字典,但是一般建议现在item中定义好然后进行调用
在item中分别定义author和content
class QsbkItem(scrapy.Item):author = scrapy.Field()content = scrapy.Field()
在qsbk_spider中也需要进行如下修改
2.6 爬取多个页面的实现
- 前提准备:放开DOWNLOAD_DELAY的限制并修改为1
# See also autothrottle settings and docs DOWNLOAD_DELAY = 1 12
- 2. 代码实现
# 定义一个基本的域名 base_domain = "https://www.qiushibaike.com"next_url = response.xpath("//ul[@class='pagination']/li[last()]/a/@href").get() # 进行一个简单的判断 if not next_url:return else:yield scrapy.Request(self.base_domain+next_url,callback=self.parse)
- 3. 运行并查看结果
三. 完整代码(此处只提供修改部分,Github上可查看完整目录及代码)
- 1. qsbk_spider
import scrapyfrom scrapy.http.response.html import HtmlResponse from scrapy.selector.unified import SelectorList# 继承scrapy.Spider类 from scrapy_demo.qsbk.qsbk.items import QsbkItemclass QsbkSpiderSpider(scrapy.Spider):name = 'qsbk_spider'# allowed_domains 指定域名,可以限制爬虫的范围allowed_domains = ['qiushibaike.com']# start_urls 开始链接 一般一个即可start_urls = ['https://www.qiushibaike.com/text/page/1/']base_domain = "https://www.qiushibaike.com"def parse(self, response):# SelectorListduanzidivs = response.xpath("//div[@class = 'col1 old-style-col1']/div")for duanzidiv in duanzidivs:# Selectorauthor = duanzidiv.xpath(".//h2//text()").get().strip()content = duanzidiv.xpath(".//div[@class='content']//text()").getall()content = "".join(content).strip()item = QsbkItem(author=author, content=content)yield itemnext_url = response.xpath("//ul[@class='pagination']/li[last()]/a/@href").get()if not next_url:returnelse:yield scrapy.Request(self.base_domain+next_url,callback=self.parse)
- 2. items
import scrapyclass QsbkItem(scrapy.Item):author = scrapy.Field()content = scrapy.Field()
- 3. pipelines
from scrapy.exporters import JsonLinesItemExporter class QsbkPipeline:def __init__(self):self.fp = open("duanzi.json","wb")self.exporter = JsonLinesItemExporter(self.fp,ensure_ascii=False,encoding='utf-8')self.exporter.start_exporting()def open_spider(self,spider):print('爬虫开始了 ...')def process_item(self, item, spider):self.exporter.export_item(item)return itemdef close_spider(self,spider):self.fp.close()print('爬虫结束了 ...')
- 4. settings
BOT_NAME = 'qsbk'SPIDER_MODULES = ['qsbk.spiders'] NEWSPIDER_MODULE = 'qsbk.spiders'# Obey robots.txt rules ROBOTSTXT_OBEY = False# Configure a delay for requests for the same website (default: 0) # See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay # See also autothrottle settings and docs DOWNLOAD_DELAY = 1# Override the default request headers: 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; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36' }# Configure item pipelines # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html ITEM_PIPELINES = {'qsbk.pipelines.QsbkPipeline': 300, }
美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!
此文转载文!
原文地址:https://blog.csdn.net/qq_16146103
著作权归作者所有,如有侵权联系小编删除!
写的真好
爬取糗事百科,应该没有人比我专业了!我爬了不下上千变!相关推荐
- Python爬虫实战(1):爬取糗事百科段子
Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...
- python爬虫经典段子_Python爬虫实战(1):爬取糗事百科段子
大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...
- JavaScript获取本机浏览器UA助力Python爬取糗事百科首页
问题背景: 使用Python编写爬虫时,经常会遇到反爬机制,例如网站要求必须使用浏览器访问.就像下面的403错误: 或者下面这种错误信息: 一般来说,这是遇到反爬机制了,对方要求使用浏览器访问.这时可 ...
- python实现数据爬取——糗事百科爬虫项目
python实现数据爬取--糗事百科爬虫项目 # urllib.request 请求模块 import urllib.request # re 模块使 Python 语言拥有全部的正则表达式功能. i ...
- 转 Python爬虫实战一之爬取糗事百科段子
静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...
- 爬虫第四战爬取糗事百科搞笑段子
又开始了新的篇章,本熊继续一个Python小白的修行之路,这次要爬取糗事百科主页的段子,恩 ..看起来不错的样子,只是段子不能吃 ,不然,啧啧... 相信很多人有去糗百看段子减压的习惯,如果能把这些段 ...
- pythonscrapy爬虫 崔庆才_Python爬虫实战一之爬取糗事百科段子
大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...
- python如何爬取糗事百科
所需要引入的库,python版本号不同,加入#coding=gbk,避免正文中出现中文时报错. 爬取的内容,跟路径在开发者模式中选择 包裹的内容. 现在我们想获取发布人,发布日期,段子内容,以及点赞的 ...
- Python爬虫实战之爬取糗事百科段子
Python爬虫实战之爬取糗事百科段子 完整代码地址:Python爬虫实战之爬取糗事百科段子 程序代码详解: Spider1-qiushibaike.py:爬取糗事百科的8小时最新页的段子.包含的信息 ...
- Python爬虫实战一之爬取糗事百科段子
点我进入原文 另外, 中间遇到两个问题: 1. ascii codec can't decode byte 0xe8 in position 0:ordinal not in range(128) 解 ...
最新文章
- 网络标准和OSI模型(1)
- js moment时间戳与时间格式相互转换
- mac 下 使用 brew 配置 环境
- acdream 1409 Musical 状压DP
- 定位pure virtual method called问题
- seaborn_Seaborn Distplot:综合指南
- 汽车美容4s连锁店会员管理系统【源码分享】
- 大疆推出Avata无人机以及飞行眼镜Goggles 2
- Linux conda tensorflow-gpu安装及Not creating XLA devices, tf_xla_enable_xla_devices not set相关问题解决
- 中国 省会 地级市 经纬度 city array
- 电脑声音同步到手机,蓝牙耳机连接台式电脑另类解决方案
- 关于Jupyter Notebook的环境配置
- 多开技术的出现发挥了什么作用?
- (深度学习)构造属于你自己的Pytorch数据集
- #千锋逆战班 Java
- win10计算机启动慢,win10启动缓慢如何解决_两种解决win10启动缓慢的方法
- 奥的斯3100电气图纸_奥的斯otis 3200电气原理图及序号与符号说明
- 【数据结构】第七章 查找
- STM32F407之CAN控制器的使用
- OKCoin徐明星:区块链技术解读及应用实践
热门文章
- “姚刘李”时代后,中国体育再无“超级偶像”?
- torch.clamp_min_方法
- 多项式拟合lm_sklearn之多项式回归
- python 3.6.4安装cx_freeze(cxfreeze)成功过程分享
- 十八、Rsync 远程同步数据
- 不会抢票?手把手最详细抢票攻略!让你也欧气满满
- IOS OpenGL ES GPUImage 差值混合 GPUImageDifferenceBlendFilter
- 2019一级消防工程师考试报名条件会有专业限制吗?
- [机缘参悟-76]:沟通技巧-职场中常见不合适语言的案例分析(尽量避免使用反问式语言)
- 计算机小宝,小宝听听电脑版