使用urllib庫資料挖掘
第一個爬蟲程式
import re from urllib import request #直接使用request中的方法 #import urllib.request #需使用urllib.request.方法 url=r"http://www.baidu.com/" #'r'去除轉義字符 #2.1.資料挖掘 #發送請求,獲取回應資訊,request自動創建請求物件,不方便使用,資訊以二進制輸出 response1=request.urlopen(url).read().decode() #解碼 #創建自定義請求 req=request.Request(url) response2=request.urlopen(req).read().decode() #解碼 #2.2.資料清洗 pat=r"<title>(.*?)</title>" #正則運算式 data1=re.findall(pat,response1) #回傳一個串列 data2=re.findall(pat,response2) #回傳一個串列 print(data1) #['百度一下,你就知道'] print(data2) #['百度一下,你就知道']
自動創建請求物件:只封裝了url資訊,自動生成其他資訊
自定義請求物件:可以自定義其他資訊,對抗反扒機制
通過方法request.Request()創建自定義請求物件,再用request.urlopen()打開物件
偽裝瀏覽器
反爬蟲機制1:判斷用戶是否是瀏覽器訪問
是否是瀏覽器通過請求包頭的User-Agent進行判斷,下面是谷歌瀏覽器的User-Agent
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36#偽裝瀏覽器爬蟲 import re from urllib import request #直接使用request中的方法 url=r"http://www.baidu.com/" #'r'去除轉義字符 #通過字典構造請求頭資訊 header={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)\ AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163\ Safari/537.36" }#['百度一下,你就知道'] 谷歌瀏覽器 #創建自定義請求 req=request.Request(url,headers=header) #傳入url和請求頭 response=request.urlopen(req).read().decode() #解碼 #2.2.資料清洗 pat=r"<title>(.*?)</title>" #正則運算式 data=https://www.cnblogs.com/Just-a-calm-programmer/p/re.findall(pat,response) #回傳一個串列 print(data) #['百度一下,你就知道']
反爬蟲機制2:判斷用戶是否一直使用同一個瀏覽器進行重復訪問
添加多個UserAgent進行訪問:
#偽裝瀏覽器 import re #正則運算式 from urllib import request #直接使用request中的方法 import random #隨機模塊 url=r"http://www.baidu.com/" #'r'去除轉義字符 #通過字典構造請求頭資訊 agent1={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)\ AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163\ Safari/537.36" }#['百度一下,你就知道'] 谷歌瀏覽器 agent2={ "User-Agent":"Mozilla/5.0 (Linux; U; Android 8.1.0; \ zh-cn; BLA-AL00 Build/HUAWEIBLA-AL00) AppleWebKit/537.36\ (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 \ MQQBrowser/8.9 Mobile Safari/537.36" }#['百度一下'] 手機瀏覽器 agent3={ "User-Agent":"Mozilla/5.0 (Linux; U; Android 8.0.0; zh-CN; \ MHA-AL00 Build/HUAWEIMHA-AL00) AppleWebKit/537.36 \ (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89\ UCBrowser/11.6.4.950 UWS/2.11.1.50 Mobile Safari/537.36 \ AliApp(DingTalk/4.5.8) com.alibaba.android.rimet/10380049 Channel/227200 language/zh-CN" }#['百度一下'] 手機瀏覽器 agentList=[agent1,agent2,agent3] agent=random.choice(agentList) print(agent) #創建自定義請求 req=request.Request(url,headers=agent) #傳入url和請求頭 response=request.urlopen(req).read().decode() #解碼 #2.2.資料清洗 pat=r"<title>(.*?)</title>" #正則運算式 data=https://www.cnblogs.com/Just-a-calm-programmer/p/re.findall(pat,response) #回傳一個串列 print(data)
自定義Opener
我們之前一直都在使用的urlopen(),他是一個特殊的opener(也就是模塊幫我們構建好的),
但是基本的urlopen()方法不支持代理、cookie等其他的HTTP/HTTPS高級功能,所以要支持這些功能:
通過request.build_opener()方法創建自定義opener物件;使用自定義的opener物件,呼叫open()方法發送請求;
如果程式里的所有請求都使用自定義的opener,可以使用request.install_opener()將自定義的opener物件定義為全域opener,表示之后呼叫的urlopen,都將使用這個自定義的opener,
構建自定義的opener需傳入處理器物件,通過request.HTTPHandler()、request.ProxyHandler()等方法創建,
代理:使用其他的ip進行訪問服務器
cookie:客戶資訊
HTTP/HTTPS:網路傳輸協議(明文/加密)
#創建自定義opener from urllib import request #構建HTTP處理器物件(專門處理HTTP請求的物件) http_header=request.HTTPHandler() #創建自定義opener opener=request.build_opener(http_header) #創建自定義請求物件 req=request.Request("http://www.baidu.com/") #發送請求,獲取回應,使用一次 # response=opener.open(req).read().decode() # print(response) #把自定義的opener設定為全域,這樣用urlopen發送的請求默認使用自定義的opener request.install_opener(opener) response2=request.urlopen(req).read().decode() print(response2)
使用代理IP
反爬蟲機制3:判斷請求來源的ip地址
使用代理ip進行訪問
#代理ip from urllib import request import random #多個代理ip proxylist=[ {"http":"182.111.64.7:41766"}, #key:協議 value:ip+port {"http":"182.111.64.7:41766"}, {"http":"101.248.64.82:80"}, ] proxy=random.choice(proxylist) #構建代理處理器物件 proxyHandler=request.ProxyHandler(proxy) #創建自定義opener opener=request.build_opener(proxyHandler) #創建請求物件 req=request.Request("http://www.baidu.com") #發生請求,回傳相應 response=opener.open(req).read().decode() print(response)
處理get請求
請求資訊包含在url里面,
#2.11.處理get請求
#在百度上搜索"北京" from urllib import request import urllib #https://www.baidu.com/s?wd=%E5%8C%97%E4%BA%AC #url編碼 wd={"wd":"北京"} url="http://www.baidu.com/s?" #構造url編碼 wdd=urllib.parse.urlencode(wd) url=url+wdd req=request.Request(url) response=request.urlopen(req).read().decode() print(response)
處理post請求
請求資訊不在url里面,而是在From Data(表單資料)中,

代碼請看有道翻譯爬蟲實作
回應
回應分很多種,但我們無需知道回應是什么型別,我們只需要回應中是否能夠提取到我們所需的資訊,
例外處理
為了防止出現例外時程式死掉,就需要進行例外處理
from urllib import request list1=[ "http://www.baidu.com", "http://www.baidu.com", "http://www.wdnmd.com", "http://www.baidu.com", "http://www.baidu.com", ] i=0 for url in list1: i=i+1 try: request.urlopen(url) except Exception as e: print("第",i,"次請求失敗",e) continue print("第",i,"次請求完成")
cookie模擬登錄
cookie(存盤再用戶本地終端上的資料),是某些網站為了辨別用戶身份,進行session跟蹤而儲存在用戶本地終端上的資料(通常經過加密),由用戶客戶端計算機暫時或永久保存的資訊,
from urllib import request url="http://www.baidu.com" #這cookie也太長了吧! header={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) \ AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/81.0.4044.122 Safari/537.36", "Cookie":"BAIDUID=B75AA8C5F67A4BA4496FDAD7D121A9AE:FG=1; \ BIDUPSID=B75AA8C5F67A4BA4496FDAD7D121A9AE; PSTM=1561710602;\ BDUSS=khaRENTZWhWS0I3b1lQRDVmS3FJfnQ0ZGdPa0ZNckRNWi1oSmdJO\ DhYOVR2WFZlSVFBQUFBJCQAAAAAAAAAAAEAAADVDV8\ YwbrIqNCkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFMwTl5TME5eZ\ ; H_WISE_SIDS=139912_142696_144498_143879_144884_141875_139043_\ 141744_144419_144135_144470_144482_131247_137745_138883_\ 141941_127969_144338_140593_144249_140350_144608_143923_\ 131423_144277_114553_142207_144899_107313_139909_144954_\ 143478_144966_142426_142911_140311_143549_144238_143862_\ 110085; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; \ yjs_js_security_passport=cc7193919e4c28b6fad4dae83d92a4bd694e9d90_1588053148_js;\ delPer=0; PSINO=6; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; \ H_PS_PSSID=1461_21090_31254_31424_31341_30905_30824_26350_31163_31475_22158; \ PHPSESSID=0hmqvu0d6o9tneinc0l1asnj91; Hm_lvt_4010fd5075fcfe46a16ec4cb65e02f04=1588059785;\ Hm_lpvt_4010fd5075fcfe46a16ec4cb65e02f04=1588059785" }#谷歌瀏覽器 req=request.Request(url,headers=header) response=request.urlopen(req) print(response.read().decode())
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/152953.html
標籤:Python
下一篇:Python爬蟲-有道翻譯
