2020版本-爬虫学习-实战练习

本文记录了一次爬虫学习的实战过程,包括从网站抓取段子标题和正文,遇到的如反爬策略、请求头设置及Unicode编码问题,并提供了问题的解决方案和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值