20行代码手把手教你爬取糗事百科中的笑话(附源码)

序言:运用BeautifulSoup爬取糗事百科中的笑话并保存至本地TXT文本,发给你的好朋友,每日一笑,让生活更美好!

目录

    • 一、解析
    • 二、编码
    • 三、源码下载
    • 四、总结
    • 五、作者Info

一、解析

任务背景:https://www.qiushibaike.com/hot/
20行代码手把手教你爬取糗事百科中的笑话(附源码)_第1张图片
窥探网页细节:观察每一页URL的变化
第一页
20行代码手把手教你爬取糗事百科中的笑话(附源码)_第2张图片
进入第二页
20行代码手把手教你爬取糗事百科中的笑话(附源码)_第3张图片
再看看第三页
20行代码手把手教你爬取糗事百科中的笑话(附源码)_第4张图片
把这些URL放在一起,观察规律

https://www.qiushibaike.com/hot/page/1/
https://www.qiushibaike.com/hot/page/2/
https://www.qiushibaike.com/hot/page/3/

从图片可以看出,该URL其他地方不变,只有最后的数字会改变,代表页数

推荐使用浏览器Chrome
插件丰富,原生功能设计对爬虫开发者非常友好

分析网页源代码
通过在原来的页面上点击,选择“检查”,观察规律,这里建议当你用elements定位元素之后,就切换到network查看相应的元素,因为elements里面的网页源代码很可能是经过JS加工过的
20行代码手把手教你爬取糗事百科中的笑话(附源码)_第5张图片
通过图片,我们发现:每一个笑话内容,都包含在一个里面,当然这里的属性不止一个,这里我们选择contentHerf这个属性

思考工具:什么工具最适合解析此种规律?BeautifulSoup

二、编码

根据第一步的分析,建立初步的代码

import requests
from bs4 import BeautifulSoup
import time
import re

headers = {
     
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
     #User-Agent可以伪装浏览器,键值为浏览器的引擎信息及版本
    'Host':'www.qiushibaike.com',
    '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'
     #Cookie里面保存了你的身份验证信息,可用于cookies反爬
  }

for page in range(10):
  url = f'https://www.qiushibaike.com/hot/page/{
       page}/'  #f-string函数,{}中填的是变化的内容,也可以使用format函数
  req = requests.get(url,headers=headers)
  html = req.text

  soup = BeautifulSoup(html,'lxml')
  for joke in soup.select('.contentHerf .content span'):
    if joke.string is not None:
      joke_data = f'笑话一则:{
       joke.string.strip()}\n\n'
      with open('../txt_file/joke.txt','ab') as f:   #以追加二进制的形式写入到文本文件中,这样就不会替换掉原先的内容
          pattern = re.compile('查看全文',re.S)
          jok = re.sub(pattern,'这里被替换了,嘻嘻!',joke_data)
          f.write(jok.encode('utf-8'))
          time.sleep(1)  #延迟爬取时间

查看爬取内容
20行代码手把手教你爬取糗事百科中的笑话(附源码)_第6张图片
上面这张图片被框起来的地方被我用正则表达式替换掉了,这里原来的内容是“查看全文”

三、源码下载

完整源码下载链接:阅读原文

四、总结

  • 请求库requests及exceptions模块
  • 解析库BeautifulSoup
  • 标准库re
  • time模块
  • TXT文本存储

五、作者Info

作者:小鸿的摸鱼日常,Goal:让编程更有趣!

原创微信公众号:『小鸿星空科技』,专注于算法、爬虫,网站,游戏开发等,期待你的关注,让我们一起成长、一起Coding!

转载说明:务必注明来源(注明:来源于公众号:小鸿星空科技, 作者:小鸿的摸鱼日常)

你可能感兴趣的:(网络爬虫实战,Python,爬虫,正则表达式,python)