百度貼吧是全球最大的中文交流平台,你是否跟我一樣,有時候看到評論區的圖檔想下載下傳呢?或者看到一段視訊想進行下載下傳呢?
今天,本期Python教程帶大家通過搜尋關鍵字來擷取評論區的圖檔和視訊。
【二、項目目标】
實作把貼吧擷取的圖檔或視訊儲存在一個檔案。
【三、涉及的庫和網站】
1、網址如下:
2、涉及的庫:requests、lxml、urrilb
【四、項目分析】
1、反爬措施的處理
前期測試時發現,該網站反爬蟲處理措施很多,測試到有以下幾個:
1) 直接使用requests庫,在不設定任何header的情況下,網站直接不傳回數 據。
2) 同一個ip連續通路40多次,直接封掉ip,起初我的ip就是這樣被封掉的。
為了解決這兩個問題,最後經過研究,使用以下方法,可以有效解決。
擷取正常的 http請求頭,并在requests請求時設定這些正常的http請求頭。
2、如何實作搜尋關鍵字?
通過網址我們可以發現隻需要在kw=() ,括号中輸入你要搜尋的内容即可。這樣就可以用一個{}來替代它,後面我們在通過循環周遊它。
【五、項目實施】
1、建立一個名為BaiduImageSpider的類,定義一個主方法main和初始化方法init。導入需要的庫。
import requests
from lxml import etree
from urllib import parse
class BaiduImageSpider(object):
def __init__(self, tieba_name):
pass
def main(self):
pass
if __name__ == '__main__':
inout_word = input("請輸入你要查詢的資訊:")
spider.main()
pass
if __name__ == '__main__':
spider= ImageSpider()
spider.main()
2、準備url位址和請求頭headers 請求資料。
import requests
from lxml import etree
from urllib import parse
class BaiduImageSpider(object):
def __init__(self, tieba_name):
self.tieba_name = tieba_name #輸入的名字
self.url = "http://tieba.baidu.com/f?kw={}&ie=utf-8&pn=0"
self.headers = {
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)'
}
'''發送請求 擷取響應'''
def get_parse_page(self, url, xpath):
html = requests.get(url=url, headers=self.headers).content.decode("utf-8")
parse_html = etree.HTML(html)
r_list = parse_html.xpath(xpath)
return r_list
def main(self):
url = self.url.format(self.tieba_name)
if __name__ == '__main__':
inout_word = input("請輸入你要查詢的資訊:")
key_word = parse.quote(inout_word)
spider = BaiduImageSpider(key_word)
spider.main()
3、用xpath進行資料分析
3.1、chrome_Xpath插件安裝
1) 這裡用到一個插件。能夠快速檢驗我們爬取的資訊是否正确。具體安裝方法如下。
2) 百度下載下傳chrome_Xpath_v2.0.2.crx, chrome浏覽器輸入:chrome://extensions/
3) 直接将chrome_Xpath_v2.0.2.crx拖動至該擴充程式頁面 ;
4) 如果安裝失敗,彈框提示“無法從該網站添加應用、擴充程式和使用者腳本”,遇到這個問題,解決方法 是:打開開發者模式,将crx檔案(直接或字尾修改為rar)并解壓成檔案夾,點選開發者模式的加載已解壓的擴充程式,選擇解壓後的檔案夾,點選确定,安裝成功;
3.2、chrome_Xpath插件使用
上面我們已經安裝好了chrome_Xpath插件,接下來我們即将使用它。
1) 打開浏覽器,按下快捷鍵F12 。
2) 選擇元素,如下圖所示。
3) 右鍵,然後選擇,“Copy XPath”,如下圖所示。
3.3、編寫代碼,擷取連結函數。
上面我們已經擷取到連結函數的Xpath路徑,接下來定義一個擷取連結函數get_tlink,并繼承self,實作多頁抓取。
'''擷取連結函數'''
def get_tlink(self, url):
xpath = '//div[@class="threadlist_lz clearfix"]/div/a/@href'
t_list = self.get_parse_page(url, xpath)
# print(len(t_list))
for t in t_list:
t_link = "http://www.tieba.com" + t
'''接下來對文章位址發送請求 将儲存到本地'''
self.write_image(t_link)
4、儲存資料
這裡定義一個write_image方法來儲存資料,如下所示。
'''儲存到本地函數'''
def write_image(self, t_link):
xpath = "//div[@class='d_post_content j_d_post_content clearfix']/img[@class='BDE_Image']/@src | //div[@class='video_src_wrapper']/embed/@data-video"
img_list = self.get_parse_page(t_link, xpath)
for img_link in img_list:
html = requests.get(url=img_link, headers=self.headers).content
filename = "百度/"+img_link[-10:]
with open(filename, 'wb') as f:
f.write(html)
print("%s下載下傳成功" % filename)
如下圖:
【六、效果展示】
1、點選運作,如下圖所示(請輸入你要查詢的資訊):
2、以吳京為例輸入,回車:
3、将圖檔下載下傳儲存在一個名為“百度”檔案夾下,這個檔案夾需要你提前在本地建立好。務必記得提前在目前代碼的同級目錄下,建立一個名為“百度”的檔案夾,否則的話系統将找不到該檔案夾,會報找不到“百度”這個檔案夾的錯誤。
4、下圖中的MP4就是評論區的視訊。
總結:
1、不建議抓取太多資料,容易對伺服器造成負載,淺嘗辄止即可。
2、本文基于Python網絡爬蟲,利用爬蟲庫,實作百度貼吧評論區爬取。就Python爬取百度貼吧的一些難點, 進行詳細的講解和提供有效的解決方案。
3、歡迎大家積極嘗試,有時候看到别人實作起來很簡單,但是到自己動手實作的時候,總會有各種各樣的問題,切勿眼高手低,勤動手,才可以了解的更加深刻。學習requests 庫的使用以及爬蟲程式的編寫。