Python爬虫_糗事百科
本爬虫任务:
爬虫糗事百科网站(https://www.qiushibaike.com/)——段子版块中所有的【段子】、【投票数】、【神回复】等内容
步骤:
- 通过翻页寻找url规律,构造url列表
- 查看审查元素,发现网页内容均在elements中,可以直接请求
- 通过xpath提取需要的内容
- 保存数据
逻辑:
- 构造外层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爬虫_糗事百科的更多相关文章
- 爬虫_糗事百科(scrapy)
糗事百科scrapy爬虫笔记 1.response是一个'scrapy.http.response.html.HtmlResponse'对象,可以执行xpath,css语法来提取数据 2.提取出来的数 ...
- Python爬虫(十七)_糗事百科案例
糗事百科实例 爬取糗事百科段子,假设页面的URL是: http://www.qiushibaike.com/8hr/page/1 要求: 使用requests获取页面信息,用XPath/re做数据提取 ...
- python scrapy实战糗事百科保存到json文件里
编写qsbk_spider.py爬虫文件 # -*- coding: utf-8 -*- import scrapy from qsbk.items import QsbkItem from scra ...
- python 爬取糗事百科 gui小程序
前言:有时候无聊看一些搞笑的段子,糗事百科还是个不错的网站,所以就想用Python来玩一下.也比较简单,就写出来分享一下.嘿嘿 环境:Python 2.7 + win7 现在开始,打开糗事百科网站,先 ...
- Python抓取糗事百科成人版图片
最近开始学习爬虫,一开始看的是静觅的爬虫系列文章,今天看到糗事百科成人版,心里就邪恶了一下,把图片都爬下来吧,哈哈~ 虽然后来实现了,但还是存在一些问题,暂且不提,先切入正题吧,没什么好说的,直接上代 ...
- Python爬取糗事百科
import urllib import urllib.request from bs4 import BeautifulSoup """ 1.抓取糗事百科所有纯 ...
- python 抓取糗事百科糗图
1 首先看下要抓取的页面 这是糗事百科里面的糗图页面,每一页里面有很多的图片,我们要做的就是把这些图片抓取下来. 2 分析网页源代码 发现源代码里面的每张图是这样储存的,所以决定使用正则匹配出图片的u ...
- python爬取糗事百科段子
初步爬取糗事百科第一页段子(发布人,发布内容,好笑数和评论数) #-*-coding:utf--*- import urllib import urllib2 import re page = url ...
- <爬虫实战>糗事百科
1.糗事百科段子.py # 目标:爬取糗事百科段子信息(文字) # 信息包括:作者头像,作者名字,作者等级,段子内容,好笑数目,评论数目 # 解析用学过的几种方法都实验一下①正则表达式.②Beauti ...
随机推荐
- JavaScript(二)——在 V8 引擎中书写最优代码
概述 一个 JavaScript 引擎就是一个程序或者一个解释程序,它运行 JavaScript 代码.一个 JavaScript 引擎可以用标准解释程序或者即时编译器来实现,即时编译器即以某种形式把 ...
- java架构《并发线程基础二》
1.关键字 volatile 使用场景: 针对与多线程公用的数据 用volatile关键字修饰 但其不保证原子性(同步).volatile关键字不具备synchronized ...
- Linux 使用Vmware克隆,修改克隆机器内容
在Vmware中搭建好一台虚拟机,拍照快照,然后克隆其他集群进行练习,克隆后的机器都需要修改的内容有如下几点: 1:各机器之间,在网络上能够互相ping通 每台机器的IP地址必须是唯一的. 进入 ca ...
- jquery的ajax提交时加载处理方法
1.定义全局的,就是所有的ajax的请求的加载都会出现相同的提示 $(function(){ //加载成功显示的状态 $("#showLoading").ajaxSuccess(f ...
- 利用Java反射机制将Bean转成Map
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...
- Jenkins(4)docker容器内部修改jenkins容器时间
前言 用docker搭建的Jenkins环境时间显示和我们本地时间相差8个小时,需修改容器内部的系统时间 查看时间 查看系统时间 date-R 进入docker容器内部,查看容器时间 docker e ...
- 2019牛客暑期多校训练营(第七场)E-Find the median(思维+树状数组+离散化+二分)
>传送门< 题意:给n个操作,每次和 (1e9范围内)即往数组里面插所有 的所有数,求每次操作后的中位数思路:区间离散化然后二分答案,因为小于中位数的数字恰好有个,这显然具有单调性.那么问 ...
- 【uva 11093】Just Finish it up(算法效率--贪心)
题意:环形跑道上有N个加油站,编号为1~N.第 i 个加油站可以加油Ai加仑,从加油站 i 开到下一站需要Bi加仑汽油.问可作为起点走完一圈后回到起点的最小加油站编号. 解法:我们把每个加油站的Ai, ...
- Codeforces Round #578 (Div. 2) C. Round Corridor (思维,数论)
题意: 有一个分两层的圆盘,每层从12点方向均分插入\(n\)和\(m\)个隔板,当内层和外层的隔板相连时是不能通过的,有\(q\)个询问,每次给你内层或外层的两个点,判断是否能从一个点走到另外一个点 ...
- hdu2196 Compute
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...