爬取糗事百科,我是专业的!

  大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只有csdn这一个平台,博客主页:https://buwenbuhuo.blog.csdn.net/

爬取糗事百科,我是专业的!
本片博文为大家带来的是爬取糗事百科,我们是专业的!

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

GIthub地址:https://github.com/459804692/qsbk/tree/master

目录
一. 爬取前的准备1.1 查看网页1.2 标签分析
二. 项目的具体实现2.1 新建爬虫项目qsbk2.2 settings设置2.3 分别提取出作者和文本内容2.4 通过pipeline保存数据2.5 定义Item2.6 爬取多个页面的实现
三. 完整代码(此处只提供修改部分,Github上可查看完整目录及代码)


爬取糗事百科,我是专业的!


一. 爬取前的准备

糗事百科官网:https://www.qiushibaike.com/

段子网址:https://www.qiushibaike.com/text/

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

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

路径表达式

表达式 描述

nodename选取此节点的所有子节点/从根节点选取//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置.选取当前节点…选取当前节点的父节点@选取属性
匹配属性

通配符 描述

*匹配任何元素节点@*匹配任何属性节点node()匹配任何类型的节点
1.1 查看网页

爬取糗事百科,我是专业的!
根据上图标记部分可以看到我们主要的要点如下。

    整体部分作者名称文本内容标签翻页

1.2 标签分析

  • 1. 首先我们需要知道我们爬取的所有内容所在标签

    爬取糗事百科,我是专业的!
    通过查看开发者选项,发现<div class ="coll old-style-coll">这个标签对应的正是所有内容的整体存放位置,那么我们也可知道之后的所有内容都是从此标签的子标签内提取得到。

    分析一番后,我们可以得到获取所有文本内容的解析式如下:

    //div[@class = 'col1 old-style-col1']/div

  • 2. 作者名称所在位置

    爬取糗事百科,我是专业的!
    由上图我们可以看到作者的位置在<h2></h2>这个标签中。

    分析一番后,我们可以得到获取作者的解析式如下:

    .//h2//text()

  • 3. 作者名称所在位置

    爬取糗事百科,我是专业的!
    由上图我们可以看到段子的位置在<div class ="content"></div>这个标签中。

    分析一番后,我们可以得到获取段子的解析式如下:

    .//div[@class='content']//text()

  • 4. 标签翻页

    爬取糗事百科,我是专业的!
    由上图我们可以看到页面的位置在<ul class ="pagination"></ul>这个标签中。

    分析一番后,我们可以得到获取页面的解析式如下:

    //ul[@class='pagination']/li[last()]/a/@href

    二. 项目的具体实现
    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("=")

    爬取糗事百科,我是专业的!
    通过运行我们可以发现其为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 item

    def 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 item

    def 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 item

    def close_spider(self,spider):
    self.fp.close()
    print('爬虫结束了 ...')

    运行结果:
    爬取糗事百科,我是专业的!

    2.5 定义Item

    爬取糗事百科,我是专业的!
    scrapy中不是说不能直接定义返回字典,但是一般建议现在item中定义好然后进行调用

    item中分别定义authorcontent

    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

  • 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 scrapy

    from scrapy.http.response.html import HtmlResponse
    from scrapy.selector.unified import SelectorList

    # 继承scrapy.Spider类
    from scrapy_demo.qsbk.qsbk.items import QsbkItem

    class 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):
    # SelectorList
    duanzidivs = response.xpath("//div[@class = 'col1 old-style-col1']/div")
    for duanzidiv in duanzidivs:
    # Selector
    author = 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 item
    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)

  • 2. items
    import scrapy

    class 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 item

    def 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://www.panoramacn.com
    源码网提供WordPress源码,帝国CMS源码discuz源码,微信小程序,小说源码,杰奇源码,thinkphp源码,ecshop模板源码,微擎模板源码,dede源码,织梦源码等。

    专业搭建小说网站,小说程序,杰奇系列,微信小说系列,app系列小说

    爬取糗事百科,我是专业的!

    免责声明,若由于商用引起版权纠纷,一切责任均由使用者承担。

    您必须遵守我们的协议,如果您下载了该资源行为将被视为对《免责声明》全部内容的认可-> 联系客服 投诉资源
    www.panoramacn.com资源全部来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。 敬请谅解! 侵权删帖/违法举报/投稿等事物联系邮箱:2640602276@qq.com
    未经允许不得转载:书荒源码源码网每日更新网站源码模板! » 爬取糗事百科,我是专业的!
    关注我们小说电影免费看
    关注我们,获取更多的全网素材资源,有趣有料!
    120000+人已关注
    分享到:
    赞(0) 打赏
  • 评论抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址

    您的打赏就是我分享的动力!

    支付宝扫一扫打赏

    微信扫一扫打赏