python 之 爬蟲資料採集
阿新 • • 發佈:2022-04-01
python 之 爬蟲資料採集
爬蟲爬取資料的第一步必須分析目標網站的技術以及網站資料結構(通過前端原始碼),可藉助chrome瀏覽器,目前python爬蟲主要會面對一下三種網站:
- 前後端分離網站
前端通過傳遞引數訪問介面,後端返回json資料,對於此類網站,python可模擬瀏覽器前端,傳送引數然後接收資料,便完成了爬蟲資料的目標 - 靜態網站
通過python的第三方庫(requests、urllib),下載原始碼,通過xpath、正則匹配資料 - 動態網站
如果採用第2種方法,下載的原始碼只是簡單的html,原始碼中沒有任何資料,因為此類動態網站需要js載入後,原始碼中才會有資料,對於此類網站,可以藉助自動化測試工具selenium
爬蟲步驟:
- 分析網站技術與目標資料的結構
- 根據第一步分析結構,選擇對應的技術策略
- 爬取資料
- 提升效能,提高操作舒適度(結合客戶端技術,為爬蟲定製介面)
- 根據需求進行資料清洗
- 資料儲存,儲存到資料庫、文件等
反扒機制:
- 當系統判斷同屬一個ip的客戶端不間斷多次訪問,會拒絕此ip的訪問
解決方案:動態代理,不停的更換ip去訪問目標系統,或者從免費的ip代理網站爬取ip,建立ip池,如果目標資料量不大,可通過降低訪問速度,以規避反扒 - 目標系統需要註冊登入才能訪問
解決方案:通過python的第三方庫(Faker)生成假登入名、密碼、個人資料進行自動化註冊、登入 - 目標系統的中目標資料頁面的連結需要處理才能進入目標資料頁進行訪問
解決方案:獲取到目標網站的目標資料頁連結無法正常訪問,需要研究頁面中的js指令碼,對連結進行處理,我個人曾通過搜狗瀏覽器爬取微訊號文章時,就遇到過這個問題,爬取到的文章連結需要進過js指令碼進行拼接,才能獲得正確的連結地址
獲取目標資料的位置:
通過xpath獲得資料的位置,可藉助chrome瀏覽器除錯功能獲得對應資料的xpath路徑
通過正則匹配
python爬蟲第三方常用庫:
urllib/requests 請求庫
Faker 生成假資料
UserAgent 生成假資料頭
etree、beautsoup 匹配資料
json 處理json資料
re 正則庫
selenium 自動化測試庫
sqlite3 資料庫 python3自帶
爬取靜態網頁資料:
import requests from fake_useragent import UserAgent #提供假的請求頭 from lxml import etree # 匹配資料 #爬取目標頁面的url url='http://***ip****:8085/pricePublic/house/public/index' headers= {'User-Agent':str(UserAgent().random)} response=requests.get(url,headers=headers) # 獲得網頁原始碼 content=response.text html=etree.HTML(content) #使用xpath查詢對應標籤處的元素值,pageNum此處爬取對應頁面的頁碼 pageNum=html.xpath('//*[@id="dec"]/div[2]/div/span[1]/text()')
爬取前後端分離系統的資料:
import json
import requests
#獲取返回的response
url='http://***ip***/FindById/22'
response=requests.get(url)
#通過json庫解析json,獲得返回的資料
DataNode = json.loads(response.text).get('returndata').get('data')[0]
爬取動態資料:
以下程式碼示例採用google瀏覽器,使用selenium庫,將瀏覽器設定為無頭模式,爬蟲會配合瀏覽器在後臺模擬人工操作,根據程式碼中定義的xpath地址,爬蟲會在瀏覽器中找到相應位置進行操作,使用selenium爬取資料時,需要安裝對應版本的瀏覽器驅動器
import requests
from faker import Faker
from fake_useragent import UserAgent
from lxml import etree
url='http://***ip***/FindById/22'
#通過faker庫獲得假email和電話號碼
fake=Fakeer('zh_CN')
email=fake.email()
tel=fake.phone_number()
data={
"email":email
}
#使用requests庫傳送post請求
response=requests.post(url,data,headers=headers)
code=response.status_code
content=response.text
#獲得返回的cookies並轉換為字典形式
cookies = requests.utils.dict_from_cookiejar(response.cookies)
#請求的時候帶上cookies
response=requests.get(url,headers=headers,cookies=cookies)