最近在學習python,不過有一個正則表達式一直搞不懂,自己直接使用最笨的方法寫出了一個百度爬蟲,只有短短16行代碼。
首先安裝必背包:
pip3 install bs4 pip3 install requests
安裝好后,輸入
import requests from bs4 import BeautifulSoup
F5運行如果不報錯則說明安裝成功。
打開瀏覽器,輸入'www.baidu.com',即進入百度,隨便搜索什么,我這里用'python'為例
可以發現,百度搜索出來的鏈接為
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=python****
最后可以簡化為:
https://www.baidu.com/s?wd=python
所以首先嘗試獲取搜索結果的html:
import requests from bs4 import BeautifulSoup url='https://www.baidu.com/s?wd='+'python' headers = {"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.16 Safari/537.36"} html = requests.get(url,headers=headers).text print(html)
可以看爬下來的數據也可以使用谷歌瀏覽器的F12
這里已谷歌的F12為例
可以發現,div標簽中
- class為'result c-container '的為非百度,非廣告的內容(我們需要的內容)
- class為'result-op c-container xpath-log'的為百度自家的內容(可以按需篩選)
- class為其它的都為廣告
首先定義篩選
soup = BeautifulSoup(html, 'html.parser')
使用for循環找出所有div標簽,且class為'result c-container'
for div in soup.find_all('div',class_="result c-container"): print(div)
讓后再次使用for循環在其中找出h3標簽
for div in soup.find_all('div',class_="result c-container"): #print(div)注釋掉方便檢查代碼 for h3 in div.find_all('h3'): print(h3.text)
再次尋找出標題和鏈接(a標簽)
for div in soup.find_all('div',class_="result c-container"): #print(div) for h3 in div.find_all('h3'): #print(h3.text) for a in h3.find_all('a'): print(a.text,' url:',a['href'])
這樣,我們就成功屏蔽了廣告、百度百科等等
整體代碼如下:
import requests from bs4 import BeautifulSoup url='https://www.baidu.com/s?wd='+'python' headers = {"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.16 Safari/537.36"} html = requests.get(url,headers=headers).text print(html) soup = BeautifulSoup(html, 'html.parser') for div in soup.find_all('div',class_="result c-container"): #print(div) for h3 in div.find_all('h3'): #print(h3.text) for a in h3.find_all('a'): print(a.text,' url:',a['href']) #with open(r'C:/爬蟲/百度.txt', 'w', encoding='utf-8') as wr:#如果需要將爬下來的內容寫入文檔,可以加上這兩句 # wr.write(page)
順便說一句,里面的headers是為了隱藏爬蟲身份,雖然訪問量大的話沒用,但不用的話百度直接可以發現你是爬蟲從而直接封你的IP,這樣會搞得你每次上百度都要輸驗證碼
版權屬於:DYblog
請聯系並同意后轉載!