参考链接:https://www.pythonf.cn/read/67478
在参考文章的基础上,总结了自己遇到的问题和解决方案,以及给代码增加了清晰的注释。
任务说明:
将网站中的段子标题和正文以字典的形式通过json序列化后存储到本地。
遇到的问题:
1、由于网站上普遍都有反爬的设置,老版本的request已经无法使用了。需要使用requests。
2、使用requests就需要获取自己的headers。
3、爬取到的内容打印出来是中文,保存为Json文件到本地后,却是unicode编码字符。
代码展示:
from bs4 import BeautifulSoup
import requests
import json
class Biedoul:
def __init__(self, url, count):
self.url = url
self.count = int(count)
self.path = r'/Users/NewScenery/SelfLearning-20201203/' # 存储的路径
self.headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
"referer": "https://www.biedoul.com/"
} # 自己的Headers, 本文下方会告诉怎么查找
# 获取Html
def getHtml(self, url):
res = requests.get(url, headers=self.headers)
if res.status_code == 200:
html = BeautifulSoup(res.text, 'html.parser')
return html
# 获取段子
def getcontent(self, html):
p = html.select("dd") # dd中是段子的标题和内容
content = [i.get_text() for i in p] # 列表中奇数位是标题,偶数位是段子
print(content)
return dict(zip(content[::2], content[1::2])) # 将列表中奇数位置对应字典的key,偶数位置为相应的value,生成字典。[::2]双冒号的意思就是从0开始,间隔为2的取值。
# 将笑话字典通过json 存储到本地
def saveJoke(self, Joke, i):
path_flie = self.path + str(i) # 每一页段子存储一个json文件
print(Joke)
# json.dump(Joke, open(path_flie +'.json', 'w', encoding='utf-8')) # 保存后为Unicode编码
json.dump(Joke, open(path_flie +'.json', 'w', encoding='utf-8'), ensure_ascii=False) # 保存后为中文
# 逻辑
def func(self):
for i in range(self.count):
url = self.url + str(i) + '/' # 拼接分页url
print(url)
self.saveJoke(self.getcontent(self.getHtml(url)), i)
if __name__ == '__main__':
b = Biedoul('https://www.biedoul.com/wenzi/', 3) # 获取前三页的段子
b.func()
print('笑话段子保存成功!')
问题解决方案:
1、编码问题参考:保存Json文件时,将unicode转为中文
2、Headers查找方法:爬虫中的requests怎么填写headers