Web爬虫|入门实战之糗事百科(附源码)
coding by real mind writing by genuine heart

解析
任务背景:https://www.qiushibaike.com/hot/
窥探网页细节:观察每一页URL的变化
第一页
进入第二页
再看看第三页
把这些URL放在一起,观察规律
1 https://www.qiushibaike.com/hot/page/1/
2 https://www.qiushibaike.com/hot/page/2/
3 https://www.qiushibaike.com/hot/page/3/
从图片可以看出,该URL其他地方不变,只有最后的数字会改变,代表页数
推荐使用浏览器Chrome
插件丰富,原生功能设计对爬虫开发者非常友好
分析网页源代码
通过在原来的页面上点击,选择“检查”,观察规律,这里建议当你用elements定位元素之后,就切换到network查看相应的元素,因为elements里面的网页源代码很可能是经过JS加工过的
通过图片,我们发现:每一个笑话内容,都包含在一个<a...class="contentHerf"
...class="content">里面,当然这里的属性不止一个,这里我们选择contentHerf这个属性
思考工具:什么工具最适合解析此种规律?BeautifulSoup
编码
根据第一步的分析,建立初步的代码
1 import requests
2 from bs4 import BeautifulSoup
3 import time
4 import re
5
6 headers = {
7 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
8 #User-Agent可以伪装浏览器,键值为浏览器的引擎信息及版本
9 'Host':'www.qiushibaike.com',
10 'Cookie':'_ga=GA1.2.2026142502.1558849033; gr_user_id=5d0a35ad-3eb6-4037-9b4d-bbc5e22c9b9f; grwng_uid=9bd612b3-7d0b-4a08-a4e1-1707e33f6995; _qqq_uuid_="2|1:0|10:1617119039|10:_qqq_uuid_|56:NjUxYWRiNDFhZTYxMjk4ZGM3MTgwYjkxMGJjNjViY2ZmZGUyNDdjMw==|fdce75d742741575ef41cd8f540465fb97b5d18891a9abb0849b3a09c530f7ee"; _xsrf=2|6d1ed4a0|7de9818067dac3b8a4e624fdd75fc972|1618129183; Hm_lvt_2670efbdd59c7e3ed3749b458cafaa37=1617119039,1617956477,1618129185; Hm_lpvt_2670efbdd59c7e3ed3749b458cafaa37=1618129185; ff2672c245bd193c6261e9ab2cd35865_gr_session_id=fd4b35b4-86d1-4e79-96f4-45bcbcbb6524; ff2672c245bd193c6261e9ab2cd35865_gr_session_id_fd4b35b4-86d1-4e79-96f4-45bcbcbb6524=true'
11 #Cookie里面保存了你的身份验证信息,可用于cookies反爬
12 }
13
14 for page in range(10):
15 url = f'https://www.qiushibaike.com/hot/page/{page}/' #f-string函数,{}中填的是变化的内容,也可以使用format函数
16 req = requests.get(url,headers=headers)
17 html = req.text
18
19 soup = BeautifulSoup(html,'lxml')
20 for joke in soup.select('.contentHerf .content span'):
21 if joke.string is not None:
22 joke_data = f'笑话一则:{joke.string.strip()}\n\n'
23 with open('../txt_file/joke.txt','ab') as f: #以追加二进制的形式写入到文本文件中,这样就不会替换掉原先的内容
24 pattern = re.compile('查看全文',re.S)
25 jok = re.sub(pattern,'这里被替换了,嘻嘻!',joke_data)
26 f.write(jok.encode('utf-8'))
27 time.sleep(1) #延迟爬取时间
查看爬取内容
上面这张图片被框起来的地方被我用正则表达式替换掉了,这里原来的内容是“查看全文”
代码优化
1 import requests
2 from bs4 import BeautifulSoup
3 import re
4 import time
5 from requests.exceptions import RequestException
6
7
8 def get_url_html():
9 headers = {
10 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
11 'Host':'www.qiushibaike.com',
12 'Cookie':'_ga=GA1.2.2026142502.1558849033; gr_user_id=5d0a35ad-3eb6-4037-9b4d-bbc5e22c9b9f; grwng_uid=9bd612b3-7d0b-4a08-a4e1-1707e33f6995; _qqq_uuid_="2|1:0|10:1617119039|10:_qqq_uuid_|56:NjUxYWRiNDFhZTYxMjk4ZGM3MTgwYjkxMGJjNjViY2ZmZGUyNDdjMw==|fdce75d742741575ef41cd8f540465fb97b5d18891a9abb0849b3a09c530f7ee"; _xsrf=2|6d1ed4a0|7de9818067dac3b8a4e624fdd75fc972|1618129183; Hm_lvt_2670efbdd59c7e3ed3749b458cafaa37=1617119039,1617956477,1618129185; Hm_lpvt_2670efbdd59c7e3ed3749b458cafaa37=1618129185; ff2672c245bd193c6261e9ab2cd35865_gr_session_id=fd4b35b4-86d1-4e79-96f4-45bcbcbb6524; ff2672c245bd193c6261e9ab2cd35865_gr_session_id_fd4b35b4-86d1-4e79-96f4-45bcbcbb6524=true'
13
14 }
15
16 try:
17 for page in range(2,5):
18 url = f'https://www.qiushibaike.com/hot/page/{page}/'
19 req = requests.get(url,headers=headers)
20 if req in not None:
21 return req.text
22 else:
23 return None
24 except RequestException:
25 return None
26
27 def main():
28 html = get_url_html()
29 soup = BeautifulSoup(html,'lxml')
30 for joke in soup.select('.contentHerf .content span'):
31 if joke.string is not None:
32 joke_data = f'笑话一则:{joke.string.strip()}\n\n'
33 with open('../txt_file/joke.txt','ab') as f:
34 pattern = re.compile('查看全文',re.S)
35 jok = re.sub(pattern,'这里被替换了,嘻嘻!',joke_data)
36 f.write(joke.encode('utf-8'))
37
38
39
40 if __name__ == '__main__':
41 main()
42 time.sleep(1)
总结
请求库requests及exceptions模块
解析库BeautifulSoup
标准库re
time模块
文本存储
定期分享爬虫实战文章 扫码关注个人公众号,带你成为“爬虫大神”or“爬虫工程师”
—— —— —— —— — END —— —— —— —— ————
欢迎扫码关注我的公众号
爬神养成记

Web爬虫|入门实战之糗事百科(附源码)的更多相关文章
- 利用python的爬虫技术爬去糗事百科的段子
初次学习爬虫技术,在知乎上看了如何爬去糗事百科的段子,于是打算自己也做一个. 实现目标:1,爬取到糗事百科的段子 2,实现每次爬去一个段子,每按一次回车爬取到下一页 技术实现:基于python的实现, ...
- python网络爬虫--简单爬取糗事百科
刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...
- python爬虫之爬取糗事百科并将爬取内容保存至Excel中
本篇博文为使用python爬虫爬取糗事百科content并将爬取内容存入excel中保存·. 实验环境:Windows10 代码编辑工具:pycharm 使用selenium(自动化测试工具)+p ...
- leaflet-webpack 入门开发系列六矢量瓦片(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- leaflet-webpack 入门开发系列五地图卷帘(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- Python爬虫:爬取糗事百科
网上看到的教程,但是是用正则表达式写的,并不能运行,后面我就用xpath改了,然后重新写了逻辑,并且使用了双线程,也算是原创了吧#!/usr/bin/python# -*- encoding:utf- ...
- Java Web开发框架Spring+Hibernate整合效果介绍(附源码)
最近花了一些时间整合了一个SpringMVC+springAOP+spring security+Hibernate的一套框架,之前只专注于.NET的软件架构设计,并没有接触过Java EE,好在有经 ...
- arcgis api 4.x for js 结合 react 入门开发系列"esri-loader"篇(附源码下载)
基于上篇的介绍,虽然有比较esri-loader.@arcgis/webpack-plugin,还是觉得有必要需要讲述一下“esri-loader”的开发模式,待大家体验后也会有更直观的感受.本篇文章 ...
- arcgis api 4.x for js 结合 react 入门开发系列初探篇(附源码下载)
你还在使用 JQuery 或者 Dojo 框架开发 arcgis api 4.x for js 吗?想试试模块化开发吗?随着前端技术的发展,arcgis api 4.x for js 也有了结合 re ...
随机推荐
- CVE-2021-25646:Apache Druid远程命令执行漏洞复现
漏洞概述 Apache Druid 是一个分布式的数据处理系统.Apache Druid包括执行用户提供的JavaScript的功能嵌入在各种类型请求中的代码.在Druid 0.20.0及更低版本中, ...
- sqli-labs lesson 11-15
从这一关开始我们开始进入到post注入的世界了,什么是post呢?就是数据从客户端提交到服务器端,例如我们在登录过程中,输入用户名和密码,用户名和密码以表单的形式提交,提交到服务器后服务器再进行验证. ...
- 013 PCIe体系结构的组成部件
一.PCIe体系结构的组成部件 PCIe总线作为处理器系统的局部总线,其作用与PCI总线类似,主要目的是为了连接处理器系统中的外部设备,当然PCIe总线也可以连接其他处理器系统.在不同的处理器系统中, ...
- Redis分布式锁的原理和实现
前言 我们之前聊过redis的,对基础不了解的可以移步查看一下: 几分钟搞定redis存储session共享--设计实现:https://www.cnblogs.com/xiongze520/p/10 ...
- 一张图带你搞懂Node事件循环
说一件重要的事儿:你还没关注公众号[前端印记],更多精彩内容等你探索-- 以下全文7000字,请在你思路清晰.精力充沛的时刻观看.保证你理解后很长时间忘不掉. Node事件循环 Node底层使用的语言 ...
- NOIP 模拟 $34\; \rm Equation$
题解 \(by\;zj\varphi\) 发现每个点的权值都可以表示成 \(\rm k\pm x\). 那么对于新增的方程,\(\rm x_u+x_v=k\pm x/0\) 且 \(\rm x_u+x ...
- NOIP 模拟 $21\; \rm Game$
题解 考试的时候遇到了这个题,没多想,直接打了优先队列,但没想到分差竟然不是绝对值,自闭了. 正解: 值域很小,所以我们开个桶,维护当前最大值. 如果新加入的值大于最大值,那么它肯定直接被下一个人选走 ...
- bootstrap导航条报错 Uncaught TypeError: Cannot convert object to primitive value
原文: https://feiffy.cc/uncaught-typeerror-cannot-convert-object-to-primitive-value 最近发现我的博客页面移动端上下拉菜单 ...
- C# - Timer 实现跑马灯
- Mybatis-plus<一> Springboot框架使用MybatisPlus代码自动生成器
Mybatis-plus<一> Springboot框架使用MybatisPlus代码自动生成器 Mybatis-plus官网: https://mp.baomidou.com/ Demo ...