本爬虫任务:

爬虫糗事百科网站(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. DNS欺骗&嗅探监听

    承接上一章,除了arp欺骗之外对的欺骗方法 a)使用kali,对dns文件进行编辑 使用的欺骗工具是ettercap.对dns文件编辑: 添加一个A记录,解释到kali自身: b)进行欺骗 通过命令行 ...

  2. FortiGate防火墙办公网常用配置

    1.建立主备机 2.配置端口 3.配置SD-WAN 4.新建上网路由 5.新建上网策略 6.建立与其他点的IPSec VPN或点对点专线

  3. sql如何查询数据库最后10条记录并正序输出

    select * from (select * from 表名 order by 字段 desc limit 10) 临时表 order by 字段

  4. 这次一定要记住opencv和cv2是什么及其基础用法

    opencv是一个基于BSD许可发行(也就是俗称的开源)的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS上.由一系列 C 函数和少量 C++ 类构成的它轻量且高 ...

  5. 每个开发人员都应该知道的WebSockets知识

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://blog.bitsrc.io/deep-dive-into-websockets- ...

  6. Pytest(12)pytest缓存

    前言 pytest 运行完用例之后会生成一个 .pytest_cache 的缓存文件夹,用于记录用例的ids和上一次失败的用例. 方便我们在运行用例的时候加上--lf 和 --ff 参数,快速运行上一 ...

  7. Codeforces Round #589 (Div. 2) Another Filling the Grid (dp)

    题意:问有多少种组合方法让每一行每一列最小值都是1 思路:我们可以以行为转移的状态 附加一维限制还有多少列最小值大于1 这样我们就可以不重不漏的按照状态转移 但是复杂度确实不大行(减了两个常数卡过去的 ...

  8. CF-1291 D - Irreducible Anagrams

    D. Irreducible Anagrams 题意 若两个字符串中每个字符的个数都是一样的,则称他们互为\(anagrams\).现在定义两个字符串s,t是\(reducible~anagram\) ...

  9. Windows10与虚拟机中CentOS-7.2进行ftp通信

    首先Linux的IP地址可以通过以下命令获取: ifconfig Windows10上面IP地址通过下面命令获取 ipconfig 你首先要保证你的主机和Linux虚拟机是可以ping通的(ping都 ...

  10. hdu5662 YJQQQAQ and the function (单调栈)

    Problem Description YJQQQAQ has an array A of length n. He defines a function fl,r,k where l,r,k are ...