完整代码在Github,如有需要可自行下载。

GIthub地址:源码地址

一. 爬取前的准备

糗事百科官网:百度即可

段子网址:百度即可

关于解析html博主选择的方法是使用xpath,如有不懂的同学,可看下面两个表格。如果想要深入学习xpath的相关知识可点击博主给的官方
文档的链接进行学习,博主在此声明是为了让读者们能够理解解析式的具体含义。

官网网址:https://lxml.de/tutorial.html

1.1 查看网页

根据上图标记部分可以看到我们主要的要点如下。

  1. 整体部分
  2. 作者名称
  3. 文本内容
  4. 标签翻页

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

著作权归作者所有,如有侵权联系小编删除!

写的真好

爬取糗事百科,应该没有人比我专业了!我爬了不下上千变!相关推荐

  1. Python爬虫实战(1):爬取糗事百科段子

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  2. python爬虫经典段子_Python爬虫实战(1):爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  3. JavaScript获取本机浏览器UA助力Python爬取糗事百科首页

    问题背景: 使用Python编写爬虫时,经常会遇到反爬机制,例如网站要求必须使用浏览器访问.就像下面的403错误: 或者下面这种错误信息: 一般来说,这是遇到反爬机制了,对方要求使用浏览器访问.这时可 ...

  4. python实现数据爬取——糗事百科爬虫项目

    python实现数据爬取--糗事百科爬虫项目 # urllib.request 请求模块 import urllib.request # re 模块使 Python 语言拥有全部的正则表达式功能. i ...

  5. 转 Python爬虫实战一之爬取糗事百科段子

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

  6. 爬虫第四战爬取糗事百科搞笑段子

    又开始了新的篇章,本熊继续一个Python小白的修行之路,这次要爬取糗事百科主页的段子,恩 ..看起来不错的样子,只是段子不能吃 ,不然,啧啧... 相信很多人有去糗百看段子减压的习惯,如果能把这些段 ...

  7. pythonscrapy爬虫 崔庆才_Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  8. python如何爬取糗事百科

    所需要引入的库,python版本号不同,加入#coding=gbk,避免正文中出现中文时报错. 爬取的内容,跟路径在开发者模式中选择 包裹的内容. 现在我们想获取发布人,发布日期,段子内容,以及点赞的 ...

  9. Python爬虫实战之爬取糗事百科段子

    Python爬虫实战之爬取糗事百科段子 完整代码地址:Python爬虫实战之爬取糗事百科段子 程序代码详解: Spider1-qiushibaike.py:爬取糗事百科的8小时最新页的段子.包含的信息 ...

  10. Python爬虫实战一之爬取糗事百科段子

    点我进入原文 另外, 中间遇到两个问题: 1. ascii codec can't decode byte 0xe8 in position 0:ordinal not in range(128) 解 ...

最新文章

  1. 《高效程序员的修炼》 读书笔记
  2. backbone.js入门
  3. Python官方最后通牒:Python 2传奇20年将落幕,Python 3接力!
  4. MySQL使用规范_心得总结
  5. ruby 生成随机字符串_Ruby程序生成随机数
  6. presto支持标准sql吗_presto技术文档
  7. [Android Pro] java.lang.IllegalStateException: Fragment(XXFragment) not attached to Activity异常
  8. NTUSER.DAT
  9. logistic回归列线图(nomogram)的多种绘制方法
  10. 10款流程图绘制工具
  11. adb devices后出现设备offline的解决方法
  12. 攻防世界 mfw 解题思路
  13. Hibernate框架学习1
  14. 分布式的Key-Value存储系统voldemort
  15. 什么是ARM TCM内存
  16. 保险初识经验汇总(重疾、医疗、寿险、意外)
  17. 漫威电影和程序员、Git 到底有什么关系?
  18. 仿新浪抢工长装修招标网站源码
  19. 仅3w报价B站up主竟带来1200w播放!品牌高性价比B站投放标杆!
  20. 国企社招很少计算机岗位,为什么国企几乎都是校招,很少有社招呢?

热门文章

  1. 深度学习论文 代码复现 环境配置操作
  2. 湖北二师计算机学院学生会,我校会与湖北第二师范学院学生会联谊活动取得圆满成功...
  3. 【NVIDIA JETSON】Xavier NX刷机
  4. 10种极具创意的验证码设计
  5. 图像噪声与贝塔分布(Beta Distribution)的概率密度
  6. C# using的使用-资源回收
  7. conda 配置虚拟环境
  8. mysql悲观锁乐观锁定义_悲观锁乐观锁的定义
  9. Java教程之Java反射
  10. 监督学习方法特点总结