本爬虫任务:

爬虫糗事百科网站(https://www.qiushibaike.com/)——段子版块中所有的【段子】、【投票数】、【神回复】等内容

步骤:

  1. 通过翻页寻找url规律,构造url列表
  2. 查看审查元素,发现网页内容均在elements中,可以直接请求
  3. 通过xpath提取需要的内容
  4. 保存数据

逻辑:

  • 构造外层url列表并进行遍历

    • 对外层url请求访问,获得响应
    • 提取内层url列表
    • 遍历内层url
      • 对内层url请求访问,获取响应
      • 提取需要的数据(段子、投票数、神回复)
      • 保存

代码:

 1 import requests
2 from lxml import etree
3 import json
4
5
6 class QiuShiSpider:
7 def __init__(self):
8 self.start_url = "https://www.qiushibaike.com/text/page/{}/"
9 self.headers = {
10 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.k36 (KHTML, like Gecko) ""Chrome/86.0.4240.11"}
11
12 def parse_url(self, url):
13 res = requests.get(url, headers=self.headers)
14 return res.content.decode()
15
16 def get_urls_inner(self, html_str):
17 html = etree.HTML(html_str)
18 urls_inner = html.xpath("//a[@class='contentHerf']/@href")
19 full_urls_inner = ["https://www.qiushibaike.com" + i for i in urls_inner]
20 return full_urls_inner
21
22 def get_contents(self, html_str):
23 html = etree.HTML(html_str)
24 text_list = html.xpath("//div[@class='content']/text()")
25 text = "".join(text_list)
26 number = html.xpath("//span[@class='stats-vote']/i/text()")[0] if len(
27 html.xpath("//span[@class='stats-vote']/i/text()")) > 0 else None
28 main_text_list = html.xpath("//div/span[@class='body']/text()")
29 return text, number, main_text_list
30
31 def save(self, content_dic):
32 with open("qs4.txt", "a", encoding="utf-8") as f:
33 f.write(json.dumps(content_dic, ensure_ascii=False, indent=2))
34
35 def run(self):
36 # 遍历url发送请求获取响应
37 urls_outer = [self.start_url.format(n + 1) for n in range(13)]
38 for url_outer in urls_outer:
39 try:
40 html_str = self.parse_url(url_outer)
41 urls_inner = self.get_urls_inner(html_str)
42 for url_inner in urls_inner:
43 content_dic = {}
44 html_str = self.parse_url(url_inner)
45 text, number, main_text_list = self.get_contents(html_str)
46 content_dic["text"] = text
47 content_dic["number"] = number
48 content_dic["main_text"] = main_text_list
49
50 self.save(content_dic)
51 print("第{}页,第{}条".format(urls_outer.index(url_outer), urls_inner.index(url_inner)))
52 except Exception as e:
53 print(e)
54
55
56 if __name__ == "__main__":
57 qs = QiuShiSpider()
58 qs.run()

Python爬虫_糗事百科的更多相关文章

  1. 爬虫_糗事百科(scrapy)

    糗事百科scrapy爬虫笔记 1.response是一个'scrapy.http.response.html.HtmlResponse'对象,可以执行xpath,css语法来提取数据 2.提取出来的数 ...

  2. Python爬虫(十七)_糗事百科案例

    糗事百科实例 爬取糗事百科段子,假设页面的URL是: http://www.qiushibaike.com/8hr/page/1 要求: 使用requests获取页面信息,用XPath/re做数据提取 ...

  3. python scrapy实战糗事百科保存到json文件里

    编写qsbk_spider.py爬虫文件 # -*- coding: utf-8 -*- import scrapy from qsbk.items import QsbkItem from scra ...

  4. python 爬取糗事百科 gui小程序

    前言:有时候无聊看一些搞笑的段子,糗事百科还是个不错的网站,所以就想用Python来玩一下.也比较简单,就写出来分享一下.嘿嘿 环境:Python 2.7 + win7 现在开始,打开糗事百科网站,先 ...

  5. Python抓取糗事百科成人版图片

    最近开始学习爬虫,一开始看的是静觅的爬虫系列文章,今天看到糗事百科成人版,心里就邪恶了一下,把图片都爬下来吧,哈哈~ 虽然后来实现了,但还是存在一些问题,暂且不提,先切入正题吧,没什么好说的,直接上代 ...

  6. Python爬取糗事百科

    import urllib import urllib.request from bs4 import BeautifulSoup """     1.抓取糗事百科所有纯 ...

  7. python 抓取糗事百科糗图

    1 首先看下要抓取的页面 这是糗事百科里面的糗图页面,每一页里面有很多的图片,我们要做的就是把这些图片抓取下来. 2 分析网页源代码 发现源代码里面的每张图是这样储存的,所以决定使用正则匹配出图片的u ...

  8. python爬取糗事百科段子

    初步爬取糗事百科第一页段子(发布人,发布内容,好笑数和评论数) #-*-coding:utf--*- import urllib import urllib2 import re page = url ...

  9. <爬虫实战>糗事百科

    1.糗事百科段子.py # 目标:爬取糗事百科段子信息(文字) # 信息包括:作者头像,作者名字,作者等级,段子内容,好笑数目,评论数目 # 解析用学过的几种方法都实验一下①正则表达式.②Beauti ...

随机推荐

  1. redis学习教程五《管道、分区》

    redis学习教程五<管道.分区>  一:管道 Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻 ...

  2. Cisco静态路由

    怎样让身在两个网段的终端会话交流呢?我们借用Cisco packet研究一下Cisco静态路由. 名词解释: 网关:(Gateway)网间连接器,或叫协议转换器:举例(参考https://baike. ...

  3. UML——宏观总结

    今天果断开始UML的学习,要不就要被12期赶超了.努力学习的效率 一.宏观导图把控 导图概要说明:RUP这块儿的内容相当于软件工程已经学过了,只不过这里换了个名词而已.面向对象,已经不再陌生,vb中早 ...

  4. Java-eclipse导入jar包

    Java-eclipse导入jar包 方法一:基本步骤式 右键项目属性,选择Property,在弹出的对话框左侧列表中选择Java Build Path,如下图所示:选择Add External JA ...

  5. 深度学习论文翻译解析(十九):Searching for MobileNetV3

    论文标题:Searching for MobileNetV3 论文作者:Andrew Howard, Mark Sandler, Grace Chu, Liang-Chieh Chen, Bo Che ...

  6. charles(3)charles防止30分钟自动重启

    前言 Charles是收费软件,可以免费试用30天.试用期过后,未付费的用户仍然可以继续使用,但是每次使用时间不能超过30分钟,并且启动时将会有10秒种的延时. 此时,我们只需网上找一个注册码即可 解 ...

  7. Pytest(13)命令行参数--tb的使用

    前言 pytest 使用命令行执行用例的时候,有些用例执行失败的时候,屏幕上会出现一大堆的报错内容,不方便快速查看是哪些用例失败. --tb=style 参数可以设置报错的时候回溯打印内容,可以设置参 ...

  8. zoj2112 Dynamic Rankings (主席树 || 树套树)

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

  9. POJ - 1226 Substrings (后缀数组)

    传送门:POJ - 1226 这个题跟POJ - 3294  和POJ - 3450 都是一样的思路,一种题型. POJ - 3294的题解可以见:https://www.cnblogs.com/li ...

  10. 【bzoj 2467】[中山市选2010]生成树(数论--排列组合)

    题目:有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈.在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形.这些五角形只在五角形圈的中心的圈上有 ...