百度贴吧爬虫

需求分析

根据输入的贴吧名字爬取指定贴吧的前100页html。

主要逻辑

为了养成面向对象编程的思想,我们选择写一个贴吧爬虫类。
1.start_url
2.发送请求,获取响应
3.提取数据,跳到下一页地址
  3.1提取列表页的url地址
  3.2请求列表页的url地址,获取详情页的第一页
  3.3提取详情页第一页的图片,提取下一页的地址
  3.4请求详情页下一页的地址,进入循环3.2-3.4
4.保存数据。
5.请求下一页的url地址,进入循环2-5步。

页面分析

1.打开chrome浏览器进入百度贴吧首页随意输入一个贴吧名。
比如李毅吧。
百度贴吧爬虫_第1张图片
我们再次输入lol。
百度贴吧爬虫_第2张图片
2.我们点击下一页进入第二页。
百度贴吧爬虫_第3张图片
发现url的地址是:https://tieba.baidu.com/f?kw=李毅&ie=utf-8&pn=50
我们再点下一页到第三页。
百度贴吧爬虫_第4张图片
发现url地址是:https://tieba.baidu.com/f?kw=李毅&ie=utf-8&pn=100
我们再把pn后面的参数改为0。发现回到了李毅吧第一页。说明每次增加一页pn后面的数字加50。
百度贴吧爬虫_第5张图片

主要模块

1.__init__方法对爬虫实例进行初始化

self.tieba_name接收用户指定的贴吧名字
self.url_temp是一个拼接字符串,其中贴吧名和页码数pn是变化的,每次增加一页,数字加50。
self.headers构造请求头,模拟浏览器访问。
右键点击检查,把User-Agent复制下来。
[外链图片转存失败(img-oInzs0Bv-1566822503357)(https://www.51spider.cn/upload/2019/8/6-86a79c23e9ad43ce9ebc36ae49511475.png)]

    def __init__(self, tieba_name):
        self.tieba_name = tieba_name
        self.url_temp = "https://tieba.baidu.com/f?kw=" + self.tieba_name + "&ie=utf-8&pn={}"
        self.headers = {
            "User - Agent": "Mozilla / 4.0(X11;Linuxx85_64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 75.0.3770.142Safari / 537.36"
        }

2.get_url_list方法构造url列表

    def get_url_list(self):
        """构造url列表"""
                url_list = list()
                for i in range(100):
                    url_list.append(self.url_temp.format(i*50))
                return url_list

此处可以用列表推导式优化代码,如下:

    def get_url_list(self):
        """构造url列表"""
        return [self.url_temp.format(i * 50) for i in range(100)]

3.parse_url方法发送请求,获取响应

使用requests发送请求,return返回响应的内容。

    def parse_url(self, url):
        """发送请求,获取响应"""
        print(url)
        response = requests.get(url, headers=self.headers)
        return response.content.decode()

4.save_html保存数据,并且保存为[贴吧名]-第[页码]页的html文件。

    def save_html(self, html_str, page_num):
        """保存html字符串"""
        file_path = "{}-第{}页.html".format(self.tieba_name, page_num)
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(html_str)

5.run方法实现主要逻辑。

    def run(self):
        """实现主要逻辑"""
        # 1.构造URL列表
        url_list = self.get_url_list()
        # 2.遍历,发送请求,获取响应
        for url in url_list:
            html_str = self.parse_url(url)
            # 3.保存
            page_num = url_list.index(url) + 1  # 页码数
            self.save_html(html_str, page_num)

最后对贴吧爬虫类进行实例化。

if __name__ == "__main__":
    tieba_spider = TiebaSpider(input("请输入贴吧名字:"))
    tieba_spider.run()

运行后输入  李毅  回车。
百度贴吧爬虫_第6张图片
出现爬取下来的html文件,可以在浏览器打开。
百度贴吧爬虫_第7张图片
本文章仅用于学习交流,切勿用于非法用途。同时欢迎各位读者在评论区进行批评指正与交流,我们一起学爬虫。
完整代码保存在我的个人网站上,感兴趣的小伙伴请点击传送门我们一起学爬虫

你可能感兴趣的:(request,Python,爬虫,贴吧)