栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python网络爬虫,利用正则表达式对百度贴吧进行爬取(非xpath)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python网络爬虫,利用正则表达式对百度贴吧进行爬取(非xpath)

对百度贴吧的爬取,主要利用了request库和re库分别获取贴吧的包和内容,最后输出贴吧所有的评论和链接。 获取百度贴吧的界面内容

    def get_data(self, url):
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
                                 ' AppleWebKit/537.36 (KHTML, like Gecko)'
                                 ' Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.33'}
        response = requests.get(url, headers=headers)
        # with open("response.html", 'wb') as f:
        #     f.write(response.content)
        # print(response.text)

        # 利用content返回字符串bytes,并利用decode进行编译
        return response.content.decode()


headers是本人浏览器的表头,以自己浏览器为主。
request.get(url)获取url的内容。

释放注释内容

高级浏览器会自动把展示的内容作为注释,调用注释的内容,因此我们需要将注释的内容给提取出现。


		# 请求获得界面
        data = self.get_data(next_url)
        # 把高等级浏览器注释掉的部分释放出来
        data = data.replace('', '')
        
        

如果学过html,应该很容易想到注释的语法,利用” 将内容括起来,因此我们需要利用字符串替换方法replace将注释语法去除。

利用正则表达式获取贴吧单个页面的帖子和链接

在对贴吧内容的提取上有很多种方式,xpath、re、直接对标签的查询等,这些方式都能让我们快速找到。(虽然xpath确实非常快,但是因为re学习比较得心应手,因此习惯用re了)


		# 正则获得贴吧信息和url
        get_url = re.findall(r'a rel=".*" href="(.*)" title=".*" target="_blank" class="j_th_tit', data)
        get_title = re.findall(r'a rel=".*" href=".*" title="(.*)" target="_blank" class="j_th_tit', data)


对得到的评论和链接进行处理

在得到其内容后,我们需要将评论和链接给对上,不可能放成一团,这样我们就不知道评论对应的链接,在数据可视化上比较差。

		# (获得url只有尾数,得在前面添加https://tieba.baidu.com)
        data_list = []
        for item in range(0, len(get_title)):
            temp = {}
            temp['title'] = get_title[item]
            temp['url'] = 'https://tieba.baidu.com' + get_url[item]
            data_list.append(temp)

这里可以利用字典,将内容放入,以方便我们提取。

循环翻页获取内容

一般的帖子肯定不止一页,因此我们需要对帖子进行翻页,直到最后一页。

        # 循环翻页获得页面信息,利用try进行判断,如果错误则表示到页数限制
        try:
            # 后面的url需要加前缀https:
            next_url = 'https:' + re.findall(r'href="(.*)" class=".*" >下一页', data)[0]
        except:
            next_url = None
        for show_data in data_list:
            print(show_data)
        print(next_url)
最后在给出主函数

if __name__ == '__main__':
    url = 'https://tieba.baidu.com/f?ie=utf-8&kw='
    name = '洛杉矶湖人'
    next_url = url + name
    baidu = Baidu()
    # 循环利用下一页next_url,当next_url为空时到达最后一页,完成提取。
    while True:
        next_url = baidu.run(next_url)
        if next_url == None:
            break


补充run函数模块

    def run(self, next_url):
        # 获取url
        # headers
        # 请求获得界面
        data = self.get_data(next_url)
        # 把高等级浏览器注释掉的部分释放出来
        data = data.replace('', '')

        # 正则获得贴吧信息和url
        get_url = re.findall(r'a rel=".*" href="(.*)" title=".*" target="_blank" class="j_th_tit', data)
        get_title = re.findall(r'a rel=".*" href=".*" title="(.*)" target="_blank" class="j_th_tit', data)
        # (获得url只有尾数,得在前面添加https://tieba.baidu.com)
        data_list = []
        for item in range(0, len(get_title)):
            temp = {}
            temp['title'] = get_title[item]
            temp['url'] = 'https://tieba.baidu.com' + get_url[item]
            data_list.append(temp)
        # print(temp)
        # 循环翻页获得页面信息,利用try进行判断,如果错误则表示到页数限制
        try:
            # 后面的url需要加前缀https:
            next_url = 'https:' + re.findall(r'href="(.*)" class=".*" >下一页', data)[0]
        except:
            next_url = None
        for show_data in data_list:
            print(show_data)
        print(next_url)
        return next_url


源文件地址:https://download.csdn.net/download/Single_minde/85624706

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/968289.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号