1.使用requests庫請求網站
網頁請求方式:(1)get :最常見的方式,一般用於獲取或者查詢資源信息,也是大多數網站使用的方式,響應速度快。
(2)post:多以表單形式上傳參數,因此除了查詢信息外,還可以修改信息。
2.怎麼確定用什麼方式請求?
(1)打開網頁,用開發者模式,我的瀏覽器是360,圖示:
(2)任意複製一條首條新聞標題,粘貼到搜索框裏;
(3)開發者模式,依次點擊‘network’,‘XHR’找到翻譯數據,點擊Headers,請求爲get方式。圖示:
3.使用Beautiful soup解析網頁
(1)安裝bs
通過requests庫可以爬取到網頁源碼,接下來要從源碼中找到並提取數據; Beautiful soup 是python 的一個庫,最主要的功能是從網頁中抓取數據。 Beautiful soup 目前已經被移植到bs4庫中,即導入Beautiful soup時需要先安裝bs4庫 bs4安裝:打開cmd:python -m pip install bs4
圖示:
(2)Beautiful soup 指定xlml解析器進行解析。 soup=BeautifulSoup(strhtml.text,'lxml')
(3)使用select(選擇器)定位數據,使用瀏覽器的開發者模式,將鼠標停留在對應數據位置並右擊,“審查元素“,開發者界面會有被選中部分,右擊 copy ---> copy selector; 將路徑粘貼在文檔中,代碼如下:
#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li:nth-child(1) > a
這是選中的第一條路徑,但我們要獲取所有的新聞頭條,因此將:li:nth-child(1)中冒號(包含冒號)後面的刪掉。如下:
#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a
4.清洗和組織數據
for item in data: # soup匹配到的有多個數據,用for循環取出 result = { 'title': item.get_text(), # 標籤在<a>標籤中,提取標籤的正文用get_text()方法 'link': item.get('href'), # 鏈接在<a>標籤的href中,提取標籤中的href屬性用get()方法,括號指定屬性數據 'ID': re.findall('\d+', item.get('href')) # 每一篇文章的鏈接都有一個數字ID。可以用正則表達式提取這個ID;\d 匹配數字; + 匹配前一個字符1次或者多次 }
5.用正則表達式提取鏈接數字ID。python調用正則表達式使用re庫,不用安裝,可直接調用。
6.完整代碼如下:
""" 通過requests庫可以爬取到網頁源碼,接下來要從源碼中找到並提取數據; Beautiful soup 是python 的一個庫,最主要的功能是從網頁中抓取數據。 Beautiful soup 目前已經被移植到bs4庫中,即導入Beautiful soup時需要先安裝bs4庫 bs4安裝:打開cmd:python -m pip install bs4 """ import requests from bs4 import BeautifulSoup import re # 在python中調用正則表達式用re庫,這個庫不用安裝,可直接調用 url = 'http://www.cntour.cn/' strhtml = requests.get(url) # 所有在源碼中的數據請求方式都是get soup = BeautifulSoup(strhtml.text, 'lxml') # lxml解析器進行解析,解析之後的文檔保存到變量soup #print(soup) # 使用soup.select引用這個路徑 data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a') #print(data) # 清洗和組織數據,完成上面的步驟只是獲得了一段目標HTML代碼,但沒有把數據提取出來 for item in data: # soup匹配到的有多個數據,用for循環取出 result = { 'title': item.get_text(), # 標籤在<a>標籤中,提取標籤的正文用get_text()方法 'link': item.get('href'), # 鏈接在<a>標籤的href中,提取標籤中的href屬性用get()方法,括號指定屬性數據 'ID': re.findall('\d+', item.get('href')) # 每一篇文章的鏈接都有一個數字ID。可以用正則表達式提取這個ID;\d 匹配數字; + 匹配前一個字符1次或者多次 } print(result)
7.結果如下:
本文是:學習《python3 爬蟲,數據清洗與可視化實戰 》第二章的學習筆記