python爬虫获取百度贴吧内容

2 篇文章 0 订阅
2 篇文章 0 订阅

python爬虫获取百度贴吧内容

博主是一个比较懒的人,不会按时更新分享分章,今天看到有人留言评论说希望我出一个爬取贴吧的教程,那么我就满足他,教程如下:

  1. 分析网页:首先我们要去爬取一个网页的内容,那么我们就需要对这个网页的网页结构有一定的了解 ,接下来我们就一步一步的来分析今天我们要去获取的目标网站百度贴吧
  2. 首先找到我们的目标网站https://tieba.baidu.com/
  3. 访问这个地址我们就看到了下面这个画面
    在这里插入图片描述
    我们可以通过网页上面的搜索功能,来搜索我们想要的贴吧,那么怎样才能让程序来输入文字并点击搜索呢?我们要先拿到搜索框和搜索按钮的节点信息,让程序去给搜索框内容赋值并在赋值后点击搜索。那么怎么才能拿到上面说的节点信息呢?其实也很简单我们可以把鼠标放到搜索框右键选择检查在这里插入图片描述
    然后就会出现这个调试控制台,我用红框框起来的也就是我们需要的输入框节点信息(搜索框一样的就不演示了)
    4.我们输入内容点击搜索之后就能看到下面这样一个列表注意:搜索栏的变化,现在的地址变为了https://tieba.baidu.com/f?ie=utf-8&kw=新冠肺炎&fr=search 后面说明为什么要注意这个
    在这里插入图片描述
    我们可以看到这样一个列表,我们现在就要获取里面的内容,同样的要获取内容就要知道节点信息(获取方式同上)我们打开控制台看一下这个列表的结构
    在这里插入图片描述
    那么我们就要拿不同的节点信息去获取信息(我只获取了非置顶的,有兴趣获取全部可以加我2511217211一起交流)
    现在我们找到了这个贴吧列表,如果才能获得里面的数据呢
    在这里插入图片描述
    现在我们把贴吧标题,吧主和评论条数拿到了,我们往下面拉,能看到一个页码
    在这里插入图片描述
    当我们点击下一页的时候仔细观察地址栏发生的变化,这决定了你是能获取所有相关的贴吧信息还是只能获取当前这一页信息的关键(第二页第三页地址分别对应如下:我们和第一页进行对比发现后面多了一个pn=100和pn=50由此我们进行猜测一波第一页是不死pn=0呢验证就是把这个pn=100改为pn=0看一下是不是我们首页的内容,经过验证pn=0就是我们的首页,图片在下面)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    那么我们就可以推出贴吧列表url变化为https://tieba.baidu.com/f?kw={keyword}&ie=utf-8&pn=页码*50那么我们就能获取所有贴吧信息了

5.现在我想获取每一遍贴吧里面的评论怎么办呢?太晚了,不写了。我困了直接给实现代码吧,(想弄明白过程和解决问题的思路,以及碰到问题如何解决的可以加我2511217211)不明白或者有兴趣一起交流学习的可以加我2511217211 使用到的技术是selenium+xpath环境配置有问题的也可以加我
代码如下

from selenium import webdriver
from time import sleep


# 获取贴吧页数
def search_numbers():
    token = 0
    driver.find_element_by_xpath('//*[@id="wd1"]').send_keys(keyword)
    driver.find_element_by_xpath('//*[@id="tb_header_search_form"]/span[1]/a').click()
    sleep(1)
    tokens = driver.find_elements_by_class_name('pagination-item')
    for i in range(0, len(tokens) - 2):
        token = tokens[i].text
    return token


# 下拉下滑条,加载数据
def drop_down():
    for x in range(1, 11, 2):
        sleep(1)
        j = x / 10
        js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
        driver.execute_script(js)


# 获取贴吧内容
def get_product(uri, i):
    driver.get(uri)
    lis = driver.find_elements_by_xpath('//*[@id="thread_list"]/li[@class=" j_thread_list clearfix"]')
    sums = len(lis)
    if i < sums:
        # 回复数
        reply = lis[i].find_element_by_xpath(
            './/div[@class="t_con cleafix"]/div[@class="col2_left j_threadlist_li_left"]/span').text
        # 标题
        title = lis[i].find_element_by_xpath(
            './/div[@class="t_con cleafix"]/div[@class="col2_right j_threadlist_li_right "]/div[@class="threadlist_lz '
            'clearfix"]/div[@class="threadlist_title pull_left j_th_tit "]/a').text
        # 主题作者
        author = lis[i].find_element_by_xpath(
            './/div[@class="t_con cleafix"]/div[@class="col2_right j_threadlist_li_right "]/div[@class="threadlist_lz '
            'clearfix"]/div[@class="threadlist_author pull_right"]/span[1]/span[1]/a').text
        # 留言列表地址
        url = lis[i].find_element_by_xpath(
            './/div[@class="t_con cleafix"]/div[@class="col2_right j_threadlist_li_right "]/div[@class="threadlist_lz '
            'clearfix"]/div[@class="threadlist_title pull_left j_th_tit "]/a').get_attribute('href')
        print(reply, title, author, url, sep='|')
        getTheNumberOfMessagePages(url)
        get_product(uri, i=i + 1)


# 获取留言页数
def getMessage(url):
    driver.get(url)
    token = driver.find_element_by_xpath(
        '//div[@class="wrap1"]/div[@class="wrap2"]/div[@id="container"]/div[@class="content clearfix"]/div['
        '@class="pb_footer"]/div[@id="thread_theme_7"]/div[@class="l_thread_info"]/ul[@class="l_posts_num"]/li['
        '@class="l_reply_num"]/span[2]').text
    return token


# 获取留言列表
def getTheNumberOfMessagePagesList():
    lis = driver.find_elements_by_xpath(
        '//*[@id="j_p_postlist"]/div[@class="l_post l_post_bright j_l_post clearfix  "]')
    for li in lis:
        try:
            userIcon = li.find_element_by_xpath('.//div[@class="d_author"]/ul[@class="p_author"]/li[@class="icon"]/div['
                                                '@class="icon_relative j_user_card"]/a').get_attribute('href')

            user = li.find_element_by_xpath(
                './/div[@class="d_author"]/ul[@class="p_author"]/li[@class="d_name"]/a').text
            comment = li.find_element_by_xpath('.//div[2]/div[1]/cc/div[2]').text
            print(user, comment, userIcon, sep="|")
        except IOError:
            pass


# 留言获取入口
def getTheNumberOfMessagePages(url):
    token = getMessage(url)
    num = 0
    while num != int(token):
        driver.get('{}?pn={}'.format(url, num + 1))
        driver.implicitly_wait(10)
        num += 1
        drop_down()
        getTheNumberOfMessagePagesList()


# 翻页
def next_page():
    token = search_numbers()
    num = 0
    while num != int(token):
        uri = 'https://tieba.baidu.com/f?ie=utf-8&kw={}&fr=search'.format(keyword, 50 * num)
        driver.get(uri)
        driver.implicitly_wait(10)
        num += 1
        drop_down()
        get_product(uri, 0)


if __name__ == "__main__":
    keyword = input('输入你想查找贴吧:')
    driver_path = "chromedriver.exe"
    driver = webdriver.Chrome(driver_path)
    # 窗口最大化,防止数据丢失
    driver.maximize_window()
    driver.get('https://tieba.baidu.com/')
    next_page()

声明:本文仅供学习交流使用,请勿用于商业用途,违者后果自负。

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值