博主是一个比较懒的人,不会按时更新分享分章,今天看到有人留言评论说希望我出一个爬取贴吧的教程,那么我就满足他,教程如下:
分析网页:首先我们要去爬取一个网页的内容,那么我们就需要对这个网页的网页结构有一定的了解 ,接下来我们就一步一步的来分析今天我们要去获取的目标网站百度贴吧首先找到我们的目标网站https://tieba.baidu.com/访问这个地址我们就看到了下面这个画面 我们可以通过网页上面的搜索功能,来搜索我们想要的贴吧,那么怎样才能让程序来输入文字并点击搜索呢?我们要先拿到搜索框和搜索按钮的节点信息,让程序去给搜索框内容赋值并在赋值后点击搜索。那么怎么才能拿到上面说的节点信息呢?其实也很简单我们可以把鼠标放到搜索框右键选择检查 然后就会出现这个调试控制台,我用红框框起来的也就是我们需要的输入框节点信息(搜索框一样的就不演示了) 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()