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爬虫|入门实战之糗事百科(附源码)的更多相关文章

  1. 利用python的爬虫技术爬去糗事百科的段子

    初次学习爬虫技术,在知乎上看了如何爬去糗事百科的段子,于是打算自己也做一个. 实现目标:1,爬取到糗事百科的段子 2,实现每次爬去一个段子,每按一次回车爬取到下一页 技术实现:基于python的实现, ...

  2. python网络爬虫--简单爬取糗事百科

    刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...

  3. python爬虫之爬取糗事百科并将爬取内容保存至Excel中

    本篇博文为使用python爬虫爬取糗事百科content并将爬取内容存入excel中保存·. 实验环境:Windows10   代码编辑工具:pycharm 使用selenium(自动化测试工具)+p ...

  4. leaflet-webpack 入门开发系列六矢量瓦片(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  5. leaflet-webpack 入门开发系列五地图卷帘(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  6. Python爬虫:爬取糗事百科

    网上看到的教程,但是是用正则表达式写的,并不能运行,后面我就用xpath改了,然后重新写了逻辑,并且使用了双线程,也算是原创了吧#!/usr/bin/python# -*- encoding:utf- ...

  7. Java Web开发框架Spring+Hibernate整合效果介绍(附源码)

    最近花了一些时间整合了一个SpringMVC+springAOP+spring security+Hibernate的一套框架,之前只专注于.NET的软件架构设计,并没有接触过Java EE,好在有经 ...

  8. arcgis api 4.x for js 结合 react 入门开发系列"esri-loader"篇(附源码下载)

    基于上篇的介绍,虽然有比较esri-loader.@arcgis/webpack-plugin,还是觉得有必要需要讲述一下“esri-loader”的开发模式,待大家体验后也会有更直观的感受.本篇文章 ...

  9. arcgis api 4.x for js 结合 react 入门开发系列初探篇(附源码下载)

    你还在使用 JQuery 或者 Dojo 框架开发 arcgis api 4.x for js 吗?想试试模块化开发吗?随着前端技术的发展,arcgis api 4.x for js 也有了结合 re ...

随机推荐

  1. CVE-2021-25646:Apache Druid远程命令执行漏洞复现

    漏洞概述 Apache Druid 是一个分布式的数据处理系统.Apache Druid包括执行用户提供的JavaScript的功能嵌入在各种类型请求中的代码.在Druid 0.20.0及更低版本中, ...

  2. sqli-labs lesson 11-15

    从这一关开始我们开始进入到post注入的世界了,什么是post呢?就是数据从客户端提交到服务器端,例如我们在登录过程中,输入用户名和密码,用户名和密码以表单的形式提交,提交到服务器后服务器再进行验证. ...

  3. 013 PCIe体系结构的组成部件

    一.PCIe体系结构的组成部件 PCIe总线作为处理器系统的局部总线,其作用与PCI总线类似,主要目的是为了连接处理器系统中的外部设备,当然PCIe总线也可以连接其他处理器系统.在不同的处理器系统中, ...

  4. Redis分布式锁的原理和实现

    前言 我们之前聊过redis的,对基础不了解的可以移步查看一下: 几分钟搞定redis存储session共享--设计实现:https://www.cnblogs.com/xiongze520/p/10 ...

  5. 一张图带你搞懂Node事件循环

    说一件重要的事儿:你还没关注公众号[前端印记],更多精彩内容等你探索-- 以下全文7000字,请在你思路清晰.精力充沛的时刻观看.保证你理解后很长时间忘不掉. Node事件循环 Node底层使用的语言 ...

  6. NOIP 模拟 $34\; \rm Equation$

    题解 \(by\;zj\varphi\) 发现每个点的权值都可以表示成 \(\rm k\pm x\). 那么对于新增的方程,\(\rm x_u+x_v=k\pm x/0\) 且 \(\rm x_u+x ...

  7. NOIP 模拟 $21\; \rm Game$

    题解 考试的时候遇到了这个题,没多想,直接打了优先队列,但没想到分差竟然不是绝对值,自闭了. 正解: 值域很小,所以我们开个桶,维护当前最大值. 如果新加入的值大于最大值,那么它肯定直接被下一个人选走 ...

  8. bootstrap导航条报错 Uncaught TypeError: Cannot convert object to primitive value

    原文: https://feiffy.cc/uncaught-typeerror-cannot-convert-object-to-primitive-value 最近发现我的博客页面移动端上下拉菜单 ...

  9. C# - Timer 实现跑马灯

  10. Mybatis-plus<一> Springboot框架使用MybatisPlus代码自动生成器

    Mybatis-plus<一> Springboot框架使用MybatisPlus代码自动生成器 Mybatis-plus官网: https://mp.baomidou.com/ Demo ...