python爬蟲獲取百度貼吧內容
python爬蟲獲取百度貼吧內容
博主是一個比較懶的人,不會按時更新分享分章,今天看到有人留言評論說希望我出一個爬取貼吧的教程,那麼我就滿足他,教程如下:
- 分析網頁:首先我們要去爬取一個網頁的內容,那麼我們就需要對這個網頁的網頁結構有一定的瞭解 ,接下來我們就一步一步的來分析今天我們要去獲取的目標網站百度貼吧
- 首先找到我們的目標網站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()