摘要:本文詳細(xì)講解了 python 網(wǎng)絡(luò)爬蟲砚嘴,并介紹抓包分析等技術(shù)十酣,實戰(zhàn)訓(xùn)練三個網(wǎng)絡(luò)爬蟲案例涩拙,并簡單補充了常見的反爬策略與反爬攻克手段。通過本文的學(xué)習(xí)耸采,可以快速掌握網(wǎng)絡(luò)爬蟲基礎(chǔ)兴泥,結(jié)合實戰(zhàn)練習(xí),寫出一些簡單的爬蟲項目虾宇。
本次的分享主要圍繞以下五個方面:
一搓彻、數(shù)據(jù)采集與網(wǎng)絡(luò)爬蟲技術(shù)簡介
二、網(wǎng)絡(luò)爬蟲技術(shù)基礎(chǔ)
三嘱朽、抓包分析
四旭贬、挑戰(zhàn)案例
五、推薦內(nèi)容
一搪泳、數(shù)據(jù)采集與網(wǎng)絡(luò)爬蟲技術(shù)簡介
網(wǎng)絡(luò)爬蟲是用于數(shù)據(jù)采集的一門技術(shù)稀轨,可以幫助我們自動地進行信息的獲取與篩選。從技術(shù)手段來說岸军,網(wǎng)絡(luò)爬蟲有多種實現(xiàn)方案靶端,如 PHP、Java凛膏、Python ...杨名。那么用 python 也會有很多不同的技術(shù)方案(Urllib、requests猖毫、scrapy台谍、selenium...),每種技術(shù)各有各的特點吁断,只需掌握一種技術(shù)趁蕊,其它便迎刃而解。同理仔役,某一種技術(shù)解決不了的難題掷伙,用其它技術(shù)或方依然無法解決。網(wǎng)絡(luò)爬蟲的難點并不在于網(wǎng)絡(luò)爬蟲本身又兵,而在于網(wǎng)頁的分析與爬蟲的反爬攻克問題任柜。希望在本次課程中大家可以領(lǐng)會爬蟲中相對比較精髓的內(nèi)容。
二沛厨、網(wǎng)絡(luò)爬蟲技術(shù)基礎(chǔ)
在本次課中宙地,將使用 Urllib 技術(shù)手段進行項目的編寫。同樣逆皮,掌握了該技術(shù)手段宅粥,其他的技術(shù)手段也不難掌握,因為爬蟲的難點不在于技術(shù)手段本身电谣。本知識點包括如下內(nèi)容:
·Urllib 基礎(chǔ)
· 瀏覽器偽裝
· 用戶代理池
· 糗事百科爬蟲實戰(zhàn)
需要提前具備的基礎(chǔ)知識:正則表達式
1)Urllib 基礎(chǔ)
爬網(wǎng)頁
打開 python 命令行界面秽梅,兩種方法:ulropen() 爬到內(nèi)存抹蚀,urlretrieve() 爬到硬盤文件。
>>> import urllib.request#open百度企垦,讀取并爬到內(nèi)存中况鸣,解碼(ignore可忽略解碼中的細(xì)微錯誤), 并賦值給data>>> data=urllib.request.ulropen("http://www.baidu.com").read().decode("utf-8”, “ignore")#判斷網(wǎng)頁內(nèi)的數(shù)據(jù)是否存在,通過查看data長度>>> len(data)提取網(wǎng)頁標(biāo)題#首先導(dǎo)入正則表達式, .*竹观?代表任意信息镐捧,()代表要提取括號內(nèi)的內(nèi)容>>> import re#正則表達式>>> pat="(.*?)"#re.compile()指編譯正則表達式#re.S是模式修正符,網(wǎng)頁信息往往包含多行內(nèi)容臭增,re.S可以消除多行影響>>> rst=re.compile(pat,re.S).findall(data)>>> print(rst)#[‘百度一下懂酱,你就知道’]
同理,只需換掉網(wǎng)址可爬取另一個網(wǎng)頁內(nèi)容
>>> data=urllib.request.ulropen("http://www.jd.com").read().decode("utf-8", "ignore")>>> rst=re.compile(pat,re.S).findall(data)>>> print(rst)
上面是將爬到的內(nèi)容存在內(nèi)存中誊抛,其實也可以存在硬盤文件中列牺,使用 urlretrieve() 方法
>>> urllib.request.urlretrieve("http://www.jd.com",filename="D:/我的教學(xué)/Python/阿里云系列直播/第2次直播代碼/test.html")
之后可以打開 test.html,京東網(wǎng)頁就出來了拗窃。由于存在隱藏數(shù)據(jù)瞎领,有些數(shù)據(jù)信息和圖片無法顯示,可以使用抓包分析進行獲取随夸。
2)瀏覽器偽裝
嘗試用上面的方法去爬取糗事百科網(wǎng)站 url="https://www.qiushibaike.com/"九默,會返回拒絕訪問的回復(fù),但使用瀏覽器卻可以正常打開宾毒。那么問題肯定是出在爬蟲程序上驼修,其原因在于爬蟲發(fā)送的請求頭所導(dǎo)致。
打開糗事百科頁面诈铛,如下圖乙各,通過 F12,找到 headers幢竹,這里主要關(guān)注用戶代理 User-Agent 字段耳峦。User-Agent 代表是用什么工具訪問糗事百科網(wǎng)站的。不同瀏覽器的 User-Agent 值是不同的焕毫。那么就可以在爬蟲程序中蹲坷,將其偽裝成瀏覽器。
將 User-Agent 設(shè)置為瀏覽器中的值咬荷,雖然 urlopen() 不支持請求頭的添加冠句,但是可以利用 opener 進行 addheaders轻掩,opener 是支持高級功能的管理對象幸乒。代碼如下:
#瀏覽器偽裝url="https://www.qiushibaike.com/"#構(gòu)建openeropener=urllib.request.build_opener()#User-Agent設(shè)置成瀏覽器的值UA=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0")#將UA添加到headers中opener.addheaders=[UA]urllib.request.install_opener(opener)data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
3)用戶代理池
在爬取過程中,一直用同樣一個地址爬取是不可取的唇牧。如果每一次訪問都是不同的用戶罕扎,對方就很難進行反爬聚唐,那么用戶代理池就是一種很好的反爬攻克的手段。
第一步腔召,收集大量的用戶代理 User-Agent
#用戶代理池uapools=[ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)", ]
第二步杆查,建立函數(shù) UA(),用于切換用戶代理 User-Agent
def UA(): opener=urllib.request.build_opener() #從用戶代理池中隨機選擇一個 thisua=random.choice(uapools) ua=("User-Agent",thisua) opener.addheaders=[ua] urllib.request.install_opener(opener) print("當(dāng)前使用UA:"+str(thisua))
for 循環(huán)臀蛛,每訪問一次切換一次 UA
for i in range(0,10): UA() data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
每爬 3 次換一次 UA
for i in range(0,10): if(i%3==0): UA() data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
(* 每幾次做某件事情亲桦,利用求余運算)
4)第一項練習(xí) - 糗事百科爬蟲實戰(zhàn)
目標(biāo)網(wǎng)站:https://www.qiushibaike.com/
需要把糗事百科中的熱門段子爬取下來,包括翻頁之后內(nèi)容浊仆,該如何獲瓤颓汀?
第一步抡柿,對網(wǎng)址進行分析舔琅,如下圖所示,發(fā)現(xiàn)翻頁之后變化的部分只是 page 后面的頁面數(shù)字洲劣。
第二步备蚓,思考如何提取某個段子?查看網(wǎng)頁代碼囱稽,如下圖所示郊尝,可以發(fā)現(xiàn)
第三步虚循,利用上面所提到的用戶代理池進行爬取。首先建立用戶代理池样傍,從用戶代理池中隨機選擇一項横缔,設(shè)置 UA。
import urllib.requestimport reimport random#用戶代理池uapools=[ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)", ]def UA(): opener=urllib.request.build_opener() thisua=random.choice(uapools) ua=("User-Agent",thisua) opener.addheaders=[ua] urllib.request.install_opener(opener) print("當(dāng)前使用UA:"+str(thisua))#for循環(huán)衫哥,爬取第1頁到第36頁的段子內(nèi)容for i in range(0,35): UA() #構(gòu)造不同頁碼對應(yīng)網(wǎng)址 thisurl="http://www.qiushibaike.com/8hr/page/"+str(i+1)+"/" data=urllib.request.urlopen(thisurl).read().decode("utf-8","ignore") #利用
還可以定時的爬染ジ铡:
Import time#然后在后面調(diào)用time.sleep()方法
換言之,學(xué)習(xí)爬蟲需要靈活變通的思想撤逢,針對不同的情況膛锭,不同的約束而靈活運用。
三蚊荣、抓包分析
抓包分析可以將網(wǎng)頁中的訪問細(xì)節(jié)信息取出初狰。有時會發(fā)現(xiàn)直接爬網(wǎng)頁時是無法獲取到目標(biāo)數(shù)據(jù)的,因為這些數(shù)據(jù)做了隱藏互例,此時可以使用抓包分析的手段進行分析奢入,并獲取隱藏數(shù)據(jù)。
1)Fiddler 簡介
抓包分析可以直接使用瀏覽器 F12 進行媳叨,也可以使用一些抓包工具進行腥光,這里推薦 Fiddler关顷。Fiddler 下載安裝。假設(shè)給 Fiddler 配合的是火狐瀏覽器武福,打開瀏覽器议双,如下圖,找到連接設(shè)置捉片,選擇手動代理設(shè)置并確定平痰。
假設(shè)打開百度,如下圖伍纫,加載的數(shù)據(jù)包信息就會在 Fiddler 中左側(cè)列表中列出來觉增,那么網(wǎng)站中隱藏相關(guān)的數(shù)據(jù)可以從加載的數(shù)據(jù)包中找到。
2)第二項練習(xí) - 騰訊視頻評論爬蟲實戰(zhàn)
目標(biāo)網(wǎng)站:https://v.qq.com/
需要獲取的數(shù)據(jù):某部電影的評論數(shù)據(jù)翻斟,實現(xiàn)自動加載逾礁。
首先可以發(fā)現(xiàn)騰訊視頻中某個視頻的評論,在下面的圖片中访惜,如果點擊” 查看更多評論”嘹履,網(wǎng)頁地址并無變化,與上面提到的糗事百科中的頁碼變化不同债热。而且通過查看源代碼砾嫉,只能看到部分評論。即評論信息是動態(tài)加載的窒篱,那么該如何爬取多頁的評論數(shù)據(jù)信息焕刮?
第一步,分析騰訊視頻評論網(wǎng)址變化規(guī)律墙杯。點擊” 查看更多評論”配并,同時打開 Fiddler,第一條信息的 TextView 中高镐,TextView 中可以看到對應(yīng)的 content 內(nèi)容是 unicode 編碼溉旋,剛好對應(yīng)的是某條評論的內(nèi)容。
解碼出來可以看到對應(yīng)評論內(nèi)容嫉髓。
將第一條信息的網(wǎng)址復(fù)制出來進行分析观腊,觀察其中的規(guī)律。下圖是兩個緊連著的不同評論的 url 地址算行,如下圖梧油,可以發(fā)現(xiàn)只有 cursor 字段發(fā)生變化,只要得到 cursor州邢,那么評論的地址就可以輕松獲得儡陨。如何找到 cursor 值?
第二步,查找網(wǎng)址中變化的 cursor 字段值迄委。從上面的第一條評論信息里尋找褐筛,發(fā)現(xiàn)恰好在 last 字段值與后一條評論的 cursor 值相同类少。即表示 cursor 的值是迭代方式生成的叙身,每條評論的 cursor 信息在其上一條評論的數(shù)據(jù)包中尋找即可。
第三步硫狞,完整代碼
a. 騰訊視頻評論爬蟲: 獲取” 深度解讀” 評論內(nèi)容(單頁評論爬蟲)
#單頁評論爬蟲import urllib.requestimport re#https://video.coral.qq.com/filmreviewr/c/upcomment/[視頻id]?commentid=[評論id]&reqnum=[每次提取的評論的個數(shù)]#視頻idvid="j6cgzhtkuonf6te"#評論idcid="6233603654052033588"num="20"#構(gòu)造當(dāng)前評論網(wǎng)址url="https://video.coral.qq.com/filmreviewr/c/upcomment/"+vid+"?commentid="+cid+"&reqnum="+numheaders={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0", "Content-Type":"application/javascript", }opener=urllib.request.build_opener()headall=[]for key,value in headers.items(): item=(key,value) headall.append(item)opener.addheaders=headallurllib.request.install_opener(opener)#爬取當(dāng)前評論頁面data=urllib.request.urlopen(url).read().decode("utf-8")titlepat='"title":"(.*?)"'commentpat='"content":"(.*?)"'titleall=re.compile(titlepat,re.S).findall(data)commentall=re.compile(commentpat,re.S).findall(data)for i in range(0,len(titleall)): try: print("評論標(biāo)題是:"+eval('u"'+titleall[i]+'"')) print("評論內(nèi)容是:"+eval('u"'+commentall[i]+'"')) print("------") except Exception as err: print(err)
b. 騰訊視頻評論爬蟲: 獲取” 深度解讀” 評論內(nèi)容(自動切換下一頁評論的爬蟲)
#自動切換下一頁評論的爬蟲import urllib.requestimport re#https://video.coral.qq.com/filmreviewr/c/upcomment/[視頻id]?commentid=[評論id]&reqnum=[每次提取的評論的個數(shù)]vid="j6cgzhtkuonf6te"cid="6233603654052033588"num="3"headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0", "Content-Type":"application/javascript", }opener=urllib.request.build_opener()headall=[]for key,value in headers.items(): item=(key,value) headall.append(item)opener.addheaders=headallurllib.request.install_opener(opener)#for循環(huán)信轿,多個頁面切換for j in range(0,100): #爬取當(dāng)前評論頁面 print("第"+str(j)+"頁")#構(gòu)造當(dāng)前評論網(wǎng)址thisurl="https://video.coral.qq.com/filmreviewr/c/upcomment/"+vid+"?commentid="+cid+"&reqnum="+numdata=urllib.request.urlopen(thisurl).read().decode("utf-8")titlepat='"title":"(.*?)","abstract":"'commentpat='"content":"(.*?)"'titleall=re.compile(titlepat,re.S).findall(data)commentall=re.compile(commentpat,re.S).findall(data)lastpat='"last":"(.*?)"'#獲取last值,賦值給cid残吩,進行評論id切換cid=re.compile(lastpat,re.S).findall(data)[0]for i in range(0,len(titleall)): try: print("評論標(biāo)題是:"+eval('u"'+titleall[i]+'"')) print("評論內(nèi)容是:"+eval('u"'+commentall[i]+'"')) print("------") except Exception as err: print(err)
四财忽、挑戰(zhàn)案例
1) 第三項練習(xí) - 中國裁判文書網(wǎng)爬蟲實戰(zhàn)
目標(biāo)網(wǎng)站:http://wenshu.court.gov.cn/
需要獲取的數(shù)據(jù):2018 年上海市的刑事案件接下來進入實戰(zhàn)講解。
第一步泣侮,觀察換頁之后的網(wǎng)頁地址變化規(guī)律即彪。打開中國裁判文書網(wǎng) 2018 年上海市刑事案件的第一頁,在換頁時活尊,如下圖中的地址隶校,發(fā)現(xiàn)網(wǎng)址是完全不變的,這種情況就是屬于隱藏蛹锰,使用抓包分析進行爬取深胳。
第二步,查找變化字段铜犬。從 Fiddler 中可以找到舞终,獲取某頁的文書數(shù)據(jù)的地址:http://wenshu.court.gov.cn/List/ListContent
可以發(fā)現(xiàn)沒有對應(yīng)的網(wǎng)頁變換,意味著中國裁判文書網(wǎng)換頁是通過 POST 進行請求癣猾,對應(yīng)的變化數(shù)據(jù)不顯示在網(wǎng)址中敛劝。通過 F12 查看網(wǎng)頁代碼,再換頁操作之后纷宇,如下圖攘蔽,查看 ListContent,其中有幾個字段需要了解:
Param: 檢索條件
Index: 頁碼
Page: 每頁展示案件數(shù)量
...
重要的是最后三個字段(vl5x,number,guid)該如何獲饶耪场满俗?首先,guid 即 uuid作岖,叫全球唯一標(biāo)識唆垃,是利用 python 中的 uuid 隨機生成的字段。其次是 number 字段痘儡,找到 ListContent 上面的 GetCode 請求辕万,恰好其 Response 中包含了 number 字段的值。而 GetCode 又是通過 POST 請求的,發(fā)現(xiàn)請求的字段只要 guid 這一項, 那么問題便迎刃而解渐尿。
最后醉途,難點在于 vl5x 字段如何獲取砖茸?打開 Fiddler隘擎,在換頁操作后债蓝,查看 ListContent 中的 vl5x 的值厘贼,并在此次 ListContent 之前出現(xiàn)的數(shù)據(jù)包中的 TextView 里尋找這個字段或值破花,一般的網(wǎng)站可以很容易找到书斜,但中國裁判文書網(wǎng)是政府網(wǎng)站赂摆,反爬策略非常高明邻邮,尋找的過程需要極高的耐心尖奔。
事實上毫蚓,中國裁判文書網(wǎng)的 vl5x 字段可以從某個 js 包中獲得征绎,獲取的方式是通過 getKey() 函數(shù)蹲姐。從網(wǎng)頁源代碼中找到 getKey() 函數(shù)的 js 代碼,由于代碼是 packed 狀態(tài)人柿,用 unpacked 工具柴墩, 將其進行解碼,后利用 js 界面美觀工具可以方便理解顷扩。
但無關(guān)緊要拐邪,只需直接將 getKey() 函數(shù) s 代碼復(fù)制到 unpack_js.html 中,就可以解出 vl5x 字段的值隘截,其中需要用到 Cookie 中的 vjkl5 字段值扎阶。需要注意提前下載好 base64.js 和 md5.js,并在 unpack_js.html 加載婶芭。
第三步东臀,以下是中國裁判文書網(wǎng)爬蟲完整代碼:
import urllib.requestimport reimport http.cookiejarimport execjsimport uuid#隨機生成guidguid=uuid.uuid4()print("guid:"+str(guid))fh=open("./base64.js","r")js1=fh.read()fh.close()fh=open("./md5.js","r")js2=fh.read()fh.close()fh=open("./getkey.js","r")js3=fh.read()fh.close()#將完整js代碼都加載進來js_all=js1+js2+js3#在生成的CookieJar添加到opner中cjar=http.cookiejar.CookieJar()opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))#Referer常用于反爬,指來源網(wǎng)址opener.addheaders=[("Referer","http://wenshu.court.gov.cn/list/list/?sorttype=1&conditions=searchWord+1+AJLX++%E6%A1%88%E4%BB%B6%E7%B1%BB%E5%9E%8B:%E5%88%91%E4%BA%8B%E6%A1%88%E4%BB%B6&conditions=searchWord+2018+++%E8%A3%81%E5%88%A4%E5%B9%B4%E4%BB%BD:2018&conditions=searchWord+%E4%B8%8A%E6%B5%B7%E5%B8%82+++%E6%B3%95%E9%99%A2%E5%9C%B0%E5%9F%9F:%E4%B8%8A%E6%B5%B7%E5%B8%82")]urllib.request.install_opener(opener)#用戶代理池import randomuapools=[ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",]#訪問首頁urllib.request.urlopen("http://wenshu.court.gov.cn/list/list/?sorttype=1&conditions=searchWord+1+AJLX++%E6%A1%88%E4%BB%B6%E7%B1%BB%E5%9E%8B:%E5%88%91%E4%BA%8B%E6%A1%88%E4%BB%B6&conditions=searchWord+2018+++%E8%A3%81%E5%88%A4%E5%B9%B4%E4%BB%BD:2018&conditions=searchWord+%E4%B8%8A%E6%B5%B7%E5%B8%82+++%E6%B3%95%E9%99%A2%E5%9C%B0%E5%9F%9F:%E4%B8%8A%E6%B5%B7%E5%B8%82").read().decode("utf-8","ignore")#將Cookie中的vjkl5字段提取出來pat="vjkl5=(.*?)s"vjkl5=re.compile(pat,re.S).findall(str(cjar))if(len(vjkl5)>0): vjkl5=vjkl5[0]else: vjkl5=0print("vjkl5:"+str(vjkl5))#將js代碼中的舊Cookie的值替換為新的vjkl5的值js_all=js_all.replace("ce7c8849dffea151c0179187f85efc9751115a7b",str(vjkl5))#使用python執(zhí)行js代碼犀农,請?zhí)崆鞍惭b好對應(yīng)模塊(在命令行中執(zhí)行pip install pyexejs)compile_js=execjs.compile(js_all)#獲得vl5x字段值vl5x=compile_js.call("getKey")print("vl5x:"+str(vl5x))url="http://wenshu.court.gov.cn/List/ListContent"#for循環(huán)惰赋,切換第1頁到10頁for i in range(0,10):try: #從GetCode中獲取number字段值 codeurl="http://wenshu.court.gov.cn/ValiCode/GetCode" #上面提到,GetCode中呵哨,只要guid一個字段赁濒,將其獲取到 codedata=urllib.parse.urlencode({ "guid":guid, }).encode('utf-8') codereq = urllib.request.Request(codeurl,codedata) codereq.add_header('User-Agent',random.choice(uapools)) codedata=urllib.request.urlopen(codereq).read().decode("utf-8","ignore") #print(codedata) #構(gòu)造請求的參數(shù) postdata =urllib.parse.urlencode({ "Param":"案件類型:刑事案件,裁判年份:2018,法院地域:上海市", "Index":str(i+1), "Page":"20", "Order":"法院層級", "Direction":"asc", "number":str(codedata), "guid":guid, "vl5x":vl5x, }).encode('utf-8') #直接發(fā)送POST請求 req = urllib.request.Request(url,postdata) req.add_header('User-Agent',random.choice(uapools)) #獲得ListContent中的文書ID值 data=urllib.request.urlopen(req).read().decode("utf-8","ignore") pat='文書ID.*?".*?"(.*?)."' allid=re.compile(pat).findall(data) print(allid) except Exception as err: print(err)
如此便可批量獲取中國裁判文書網(wǎng)中的案件信息。友情提示孟害,如果頻繁爬取該網(wǎng)站拒炎,需擴充用戶代理池。
五挨务、推薦內(nèi)容
1)常見反爬策略與反爬攻克手段介紹
數(shù)據(jù)的隱藏可以算是一種反爬策略之一击你,抓包分析是該反爬策略常見的反爬攻克手段玉组。
當(dāng)然,反爬還有很多手段丁侄,比如通過 IP 限制惯雳、UA 限制、驗證碼限制... 等等.
2)如何深入學(xué)習(xí) Python 網(wǎng)絡(luò)爬蟲(深入學(xué)習(xí)路線介紹)
通過上述的介紹鸿摇,相信對網(wǎng)絡(luò)爬蟲已經(jīng)有了基礎(chǔ)的了解石景,以及能夠?qū)懗鲆恍┖唵蔚呐老x項目。
以下項目可以提供練習(xí):
淘寶商品圖片爬蟲項目
淘寶商品爬蟲項目
…
3)關(guān)于 Python 爬蟲户辱,推薦書籍
《Python 程序設(shè)計基礎(chǔ)實戰(zhàn)教程》 . 清華大學(xué)出版社. 2018 年
《精通 Python 網(wǎng)絡(luò)爬蟲》. 機械工業(yè)出版社. 2017 年 4 月
4)所有項目代碼我都放打包放到了后臺鸵钝,私信回復(fù)關(guān)鍵詞【資料包】獲取
作者:西邊人
程序爬蟲各種有用資源分享給大家
私人微信:mcfmcfmcf