python最简洁!最简单!爬取糗百笑话内容!
最近突然想起了半年前上python实验课的时候老师布置的实验内容,爬取糗百笑话,印象非常深刻,当时只学了关于爬虫最基本的内容,虽然自己很感兴趣,但仅仅简单了解了相关库的基本的使用方法,根本无从下手(当时看了两个多小时的代码,全程懵逼,还记得当时连替换requests请求的headers都要百度),所谓说,老师领进门,修行靠自己,现在就弥补以下当时的遗憾(时间过得有点久,哈哈哈哈哈),用自己认为最简单!最简洁!的代码爬取一下。
首先给出目标网页的第一页的url:
上代码:
1.所要用到的库:
import requests
from bs4 import BeautifulSoup
import re
老样子,requests库主要用来发起请求获得目标网页的源代码,BeautifulSoup库和re库组合使用,利用正则表达式***一行代码***抓取所要的内容。
2.给出整体程序的执行流程(是不是一看就明白呀):
if __name__ == '__main__':
page = 5 #page表示爬取笑话内容的html网页的页数,此为5页
url_list = [] #存放5页的url链接
#通过观察每一页的url链接的特点,通过for循环将每一页的url链接存入url_list列表中备用
for i in range(1,page+1):
i = str(i)
url = 'https://www.qiushibaike.com/hot/page/' + i + '/'
url_list.append(url)
list = getJokeText(url_list) #解析每一个网页源代码,获得未经处理的笑话内容,列表形式返回
text_list = subText(list) #处理内容,将<br/>换行符剔除
saveText(text_list) #保存到本地指定.txt文本文档中
3.具体解析每一个方法的实现:
(1)获取网页的源码:
#获取网页的源码
def getHTMLText(url):
try:
hd = {'user-agent':'chorme/10'}
r = requests.get(url,headers = hd)
r.raise_for_status()
#r.encoding = r.apparent_encoding
return r.text
except:
return ''
这个代码可以作为一个爬取网页源码的通用框架来使用,需要注意的是此处未使用从爬取网页解析出的编码方式,及r.apparent_encoding返回的结果,因为requests请求返回的头部信息中就有编码方式gbk,不试用此会出现乱码的情况,兄弟们可以自己试一试哟。
(2)解析每一个网页源代码,获得未经处理的笑话内容,列表形式返回:
在写代码前先观察下目标内容的所在的标签位置(F12直接查看源码):
很容易就看出其中的特点,上代码!
#解析网页
def getJokeText(url_list):
a = [] #存放未经处理的爬取到的笑话内容
for i in url_list:
soup = BeautifulSoup(getHTMLText(i),'html.parser')
#通过soup.find_all方法,设置其中的属性直接找到存放内容的标签<span>的父亲标签<div class="context">
for j in soup.find_all('div', attrs={'class': 'content'}):
text = re.findall(r'<span>(.*?)</span>', str(j), re.S) #正则表达式一行代码爬取内容
a.append(text) #添加进a列表中
return a
此时已经将内容爬取到,但其中包含很多换行符标签,在网页源代码截屏处也可以看到
注意re.findall()中设置标志r.S是表明包含换行符在内的所有内容,若不设置的话会返回空的呢,可以自己试一试其中的区别。
(3)处理内容,将换行符剔除:
def subText(list):
text_list = [] #存放处理好的内容
for list in list:
for text in list:
tds = re.sub(r'<br\/>', '', text, re.S) #用正则表达式将内容中的<br/>找到替换为空字符串
text_list.append(tds)
return text_list
(4)保存到本地指定.txt文本文档中:
def saveText(text_list):
path = 'jok.txt'
with open(path, 'w', encoding='utf-8') as f:
for i in text_list:
# i.encode("utf-8")
f.write(i)
注意在打开文件时必须指定编码方式,否则会保存不进去的哟,你可以试一试二者的不同
(5)出结果!上图!
是不是很简单呀,总结以下自己在写代码时的新的体会,当抓取多个页面的具有相同格式的内容时,建议先从一页开始,当一页成功的时候,多页内容直接for循环就完全ojbk了