目 录CONTENT

文章目录

Python爬虫入门_实战百度贴吧爬虫

小张的探险日记
2021-09-07 / 0 评论 / 0 点赞 / 472 阅读 / 2,186 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-12-16,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1.爬虫需求

爬取 具体贴吧 作者、内容、发帖时间、回复数量,, 百度贴吧有 反爬虫机制 所有可能会出现 出现验证码的情况,只需要过一会 再试即可, 这里只为 练习使用 BeautifulSoup 没有去破解验证码。

image-20210509224420252

2.实现效果

​ 每一页写入一个 txt 文件

image-20210509224803368

3.代码实现

​ 代码相对来说 比较容易理解,看注释即可理解

# 百度贴吧,没有解决访问过多后,被安全限制
import time

import requests
from bs4 import BeautifulSoup

url = 'http://tieba.baidu.com/f?ie=utf-8&kw=%E9%A2%86%E5%85%8B03'
base_url = 'http://tieba.baidu.com'
pn = 0


def get_html(url):
    html = requests.get(url)
    # 设置编码方式,不然可能出现乱码,不要问我 为什么知道,因为 它出现了 乱码,然后它是中文的,我就试了下 GBK 编码 是否可以。
    requests.encoding = 'GBK'
    # with open('../test.html', 'wb') as f:
    #     f.write(html.content)
    return html.text


# 帖子列表
def get_list(text, pn):
    print('正在爬取%s ' %(pn + 1))
    soup = BeautifulSoup(text, 'html.parser')
    # 检查是否被 安全限制了
    desc = soup.find(class_='timeout-title')
    if desc is not None:
        print('被安全限制')
        return

    # 分为 被置顶的帖子和 没有被置顶的帖子
    top_list = soup.find_all(class_='t_con cleafix')
    # 存放所有的帖子
    post_list = []
    for item in top_list:
        time.sleep(1)
        # 帖子的链接地址
        href = item.find(class_='j_th_tit ').get('href')
        # 过滤我不想爬取的页面
        if href == '/bawu2/errorPage?bz=1':
            continue

        author = item.find(class_='tb_icon_author')['title']
        create_date = item.find(class_='pull-right is_show_create_time').string
        answer_count = item.find(class_='threadlist_rep_num center_text').string
        post = post_details(base_url + href, author, answer_count, create_date)
        post_list.append(post)

    # 一页写入一次文件
    with open(str(pn)+'.txt','a+',encoding='utf-8') as f:
        for post in post_list:
            f.write('标题: {} \t 发帖人:{} \t 发帖时间:{} \t 回复数量: {} \n'.format(
                post['title'], post['author'], post['createDate'], post['answerCount']))

    # 判断是否还有下一页
    next_page = soup.find(class_='next pagination-item ')
    if next_page is not None:
        pn = pn + 50
        print('开始爬取下一页')
        get_list(get_html(url+'&pn='+str(pn)), pn)

# 帖子详情界面
def post_details(link_url, author, answer_count, create_date):
    post = {}

    html = get_html(link_url)
    soup = BeautifulSoup(html, 'html.parser')
    # 帖子标题
    post['title'] = soup.find(class_='core_title_txt').string
    # 作者
    post['author'] = author
    # 回复数
    post['answerCount'] = answer_count
    # 发布日期
    post['createDate'] = create_date

    # 爬取回复列表
    # revert_list = soup.find(id='j_p_postlist').children
    # for item in revert_list:
    #     img = item.find('img')
    #     if img is None:
    #         continue
    #
    #     # 回复者名称
    #     print(img['username'])
    #     # 回复者头像
    #     print(img['src'])
    #     # 回复内容
    #     print(item.find(class_='j_d_post_content').text)
    return post

if __name__ == '__main__':
    get_list(get_html(url), pn)

不积跬步无以至千里,送给自己。 end

没什么好抱怨的,今天的每一步,都是在为之前的每一次选择买单,这也叫担当!无论你此刻是否迷茫,在阳光升起的时候,请相信,努力的人最终都有回报。

img

0

评论区