python爬虫入门技术手册
點(diǎn)擊“簡(jiǎn)說Python”,選擇“星標(biāo)公眾號(hào)”
福利干貨,第一時(shí)間送達(dá)!
圖片by@unsplash
作者:livan
閱讀文本大概需要 30?分鐘。
老表建議收藏,慢慢看。
很久以前寫了一篇爬蟲的文章,把它放在CSDN上(livan1234)沒想到點(diǎn)擊量竟然暴漲,足以看到大家在數(shù)據(jù)獲取方面的需求,爬蟲技術(shù)現(xiàn)在已經(jīng)非常普遍,其用途也非常廣泛,很多牛人在各個(gè)領(lǐng)域做過相關(guān)的嘗試,比如:
1)爬取汽車之家數(shù)據(jù),利用論壇發(fā)言的抓取以及NLP,對(duì)各種車型的車主做畫像。
2)抓取各大電商的評(píng)論及銷量數(shù)據(jù),對(duì)各種商品(顆粒度可到款式)沿時(shí)間序列的銷量以及用戶的消費(fèi)場(chǎng)景進(jìn)行分析。
3)還可以根據(jù)用戶評(píng)價(jià)做情感分析,實(shí)時(shí)監(jiān)控產(chǎn)品在消費(fèi)者心目中的形象,對(duì)新發(fā)布的產(chǎn)品及時(shí)監(jiān)控,以便調(diào)整策略。
4)抓取房產(chǎn)買賣及租售信息,對(duì)熱熱鬧鬧的房?jī)r(jià)問題進(jìn)行分析。
5)抓取大眾點(diǎn)評(píng)、美團(tuán)網(wǎng)等餐飲及消費(fèi)類網(wǎng)站:各種店面的開業(yè)情況以及用戶消費(fèi)和評(píng)價(jià),了解周邊變化的口味,所謂是“舌尖上的爬蟲”。以及各種變化的口味,比如:啤酒在衰退,重慶小面在崛起。
6)58同城等分類信息網(wǎng)站:抓取招商加盟的數(shù)據(jù),對(duì)定價(jià)進(jìn)行分析,幫助網(wǎng)友解惑。
7)拉勾網(wǎng)、中華英才網(wǎng)等招聘網(wǎng)站:抓取各類職位信息,分析最熱門的職位以及薪水。
8)掛號(hào)網(wǎng)等醫(yī)療信息網(wǎng)站:抓取醫(yī)生信息并于宏觀情況進(jìn)行交叉對(duì)比。
9)應(yīng)用寶等App市場(chǎng):對(duì)各個(gè)App的發(fā)展情況進(jìn)行跟蹤及預(yù)測(cè)。(順便吹一下牛,我們這個(gè)榜單很早就發(fā)現(xiàn)小紅書App的快速增長(zhǎng)趨勢(shì)以及在年輕人中的極佳口碑)
10)攜程、去哪兒及12306等交通出行類網(wǎng)站:對(duì)航班及高鐵等信息進(jìn)行抓取,能從一個(gè)側(cè)面反映經(jīng)濟(jì)是否正在走入下行通道。
11)雪球等財(cái)經(jīng)類網(wǎng)站:抓取雪球KOL或者高回報(bào)用戶的行為,找出推薦股票
12)58同城二手車、易車等汽車類網(wǎng)站:什么品牌或者型號(hào)的二手車殘值高?更保值?反之,什么類型的貶值較快?- 二手車,找出最佳的買車時(shí)間以及最保值的汽車。
13)神州租車、一嗨租車等租車類網(wǎng)站:抓取它們列舉出來的租車信息,長(zhǎng)期跟蹤租車價(jià)格及數(shù)量等信息。
14)各類信托網(wǎng)站:通過抓取信托的數(shù)據(jù),了解信托項(xiàng)目的類型及規(guī)模。其實(shí)還有很多數(shù)據(jù),不一一列舉了。
上次的文章是在討論移動(dòng)端的數(shù)據(jù)獲取:https://blog.csdn.net/livan1234/article/details/80850978
本文對(duì)爬蟲做一個(gè)全面的總結(jié),不一定包治百病,但是能治好大部分疾病,希望能夠?qū)Υ蠹矣兴鶐椭?#xff1a;
urllib庫(kù)
這是一個(gè)在爬蟲領(lǐng)域繞不開的庫(kù),他支持 http 的爬取,幾乎可以取到方方面面的內(nèi)容。
以下面的豆瓣案例做一個(gè)簡(jiǎn)要的解釋:
豆瓣小案例:
#!/usr/bin/env python
# _*_ UTF-8 _*_
# author:livan
import urllib.request?
import re
data= urllib.request.urlopen("https://read.douban.com/provider/all").read()??
data = data.decode("utf-8")
pattern = '<div>(.*?)</div>'
mydata = re.compile(pattern).findall(data)
fh = open("出版社.txt", "w")
for i in range(0,len(mydata)):?
? ? fh.write(mydata[i]+"\n")
? ? fh.close()
常用函數(shù)為:
import urllib.request?
#1)將第一個(gè)參數(shù)中的網(wǎng)址,直接下載到filename路徑下,爬下來的數(shù)據(jù)為一個(gè)網(wǎng)頁。
data= urllib.request.urlretrieve("http://www.hellobi.com",filename="F:\python_workspace\spider_douban")
#2)清除緩存,清除urlretrieve? 等下載時(shí)保存的數(shù)據(jù)
urllib.request.urlcleanup()
#3)爬取頁面數(shù)據(jù)
file= urllib.request.urlopen("http://www.hellobi.com")
#4)返回當(dāng)環(huán)境的信息file.info()??
#5)獲取當(dāng)前網(wǎng)頁的狀態(tài)碼和網(wǎng)址。
print(file.getcode())?
print(file.geturl())
超時(shí)設(shè)置
由于網(wǎng)絡(luò)速度或者對(duì)方服務(wù)器的問題,我們爬取一個(gè)網(wǎng)頁的時(shí)候,都需要設(shè)置時(shí)間,我們?cè)L問一個(gè)網(wǎng)頁,如果該網(wǎng)頁長(zhǎng)時(shí)間未響應(yīng),那么我們的系統(tǒng)就會(huì)判斷該網(wǎng)頁超時(shí)了,即無法打開該網(wǎng)頁。
有時(shí)候,我們需要根據(jù)自己的需求,來設(shè)置超時(shí)的時(shí)間值,比如:有些網(wǎng)站會(huì)反應(yīng)快,我們希望2秒沒有反應(yīng)則判斷為超時(shí),那么此時(shí),timeout=2即為設(shè)置方式,即在 urlopen 中加入 timeout 參數(shù)。再比如,有些網(wǎng)站服務(wù)器反應(yīng)慢,那么我們希望100秒沒有反應(yīng),才判斷超時(shí),此時(shí)的timeout即設(shè)置為100,接下來為大家講解爬蟲超時(shí)的設(shè)置。
#!/usr/bin/env python
# _*_ UTF-8 _*_
# author:livan
file = urllib.request.urlopen("http://www.hellobi.com", timeout=10)
for i in range(0, 100):
? ? try:
? ? ? ? file = urllib.request.urlopen("http://yum.iqianyue.com", timeout=1)
? ? ? ? data = file.read()
? ? ? ? print(len(data))?
? ? except Exception as e:
? ? ? ? print("出現(xiàn)異常:"+str(e))
自動(dòng)模擬 Http 請(qǐng)求
客戶端如果要與服務(wù)器端進(jìn)行通信,需要通過http進(jìn)行請(qǐng)求,http請(qǐng)求有很多種,我們?cè)诖藭?huì)講post與get兩種請(qǐng)求方式,比如登錄、搜索某些信息的時(shí)候會(huì)用到。
1)處理 get 請(qǐng)求:
#!/usr/bin/env python?
# _*_ UTF-8 _*_
import urllib.request?
keywd = "python"??
#對(duì)網(wǎng)址中出現(xiàn)的中文進(jìn)行相應(yīng)的編碼,得到進(jìn)行編碼之后的中文,后面可以直接使用。
keywd=urllib.request.quote(keywd)??
url = "http://www.baidu.com/s?wd"+keywd+"&ie=urf-8&tn=96542061_hao_pg"??
#將url 封裝為一個(gè)請(qǐng)求
req = urllib.request.Request(url)
data = urllib.request.urlopen(req).read()?
fh = open("test.txt","wb")??
fh.write(data)
fh.close()
2)處理 post 請(qǐng)求:
所謂post請(qǐng)求即為HTML 的 form 中存在 method=“post”的標(biāo)簽,如下文:
<body>
<form action=””,method=”post”>
姓名:<input name=”name” type=”text”/><br>
密碼:<input name=”pass” type=”text”/><br>
<input name=”” type=”submit” value=”點(diǎn)擊提交”>
</body>
在新浪 login.sina.com.cn 中即可看到,form 為 post 方式。我們只需要 form 表單中的 name 屬性即可。
如下圖:
#!/usr/bin/env python?
# _*_ UTF-8 _*_
import urllib.request
import urllib.parse
url = "http://www.iqianyue.com/mypost/"
#設(shè)置對(duì)應(yīng)的表單信息,urlencode中針對(duì)代碼中的name值。
mydata = urllib.parse.urlencode({
"name":"ceo@iqianyue.com","pass":"123456" }).encode("utf-8")
#將數(shù)據(jù)轉(zhuǎn)換為請(qǐng)求
req = urllib.request.Request(url, mydata)
#發(fā)送請(qǐng)求
data = urllib.request.urlopen(req).read()
fh = open("test_post.txt","wb")??
fh.write(data)
fh.close()
爬蟲的異常處理
爬蟲在運(yùn)行的過程中,很多時(shí)候都會(huì)遇到這樣或那樣的異常。如果沒有異常處理,爬蟲遇到異常時(shí)就會(huì)直接崩潰停止運(yùn)行,下次再次運(yùn)行時(shí),又會(huì)重頭開始,所以,要開發(fā)一個(gè)具有頑強(qiáng)生命力的爬蟲,必須要進(jìn)行異常處理。
異常處理主要是為了增強(qiáng)代碼的穩(wěn)定性。
兩者都是異常處理的類,HTTPError是URLError的子類,HTTPError有異常狀態(tài)碼與異常原因,URLError沒有異常狀態(tài)碼,所以,在處理的時(shí)候,不能使用URLError直接替代HTTPError。如果要替代,必須要判斷是否有狀態(tài)碼屬性。
接下來我們通過實(shí)戰(zhàn)講解:
urlError:
1) 連不上服務(wù)器
2) 遠(yuǎn)程的url不存在
3) 本地沒有網(wǎng)絡(luò)
4) 觸發(fā)了對(duì)應(yīng)的httpError子類
具體的實(shí)戰(zhàn)為:
#!/usr/bin/env python
# _*_ UTF-8 _*_
# author:livan
import urllib.error?
import urllib.request
try:
? ? urllib.request.urlopen("http://blog.csdssn.net")?
? ? print("111")
except urllib.error.URLError as e:
? ? if hasattr(e, "code"):
? ? ? ? print(e.code)
? ? if hasattr(e, "reason"):
? ? ? ? print(e.reason)
爬蟲的偽裝技術(shù)
我們可以試試爬取csdn博客,我們發(fā)現(xiàn)會(huì)返回403,因?yàn)閷?duì)方服務(wù)器會(huì)對(duì)爬蟲進(jìn)行屏蔽。此時(shí)我們需要偽裝成瀏覽器才能爬取。
瀏覽器偽裝我們一般通過報(bào)頭進(jìn)行,接下來我們通過實(shí)戰(zhàn)分析一下。
#!/usr/bin/env python?
# _*_ UTF-8 _*_
import urllib.error?
import urllib.request??
url="http://blog.csdn.net/weiwei_pig/article/details/52123738"??
header = ("User-Agent":"Mozilla/5.0? (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)? Chrome/56.0.2924.87 Safari/537.36")
#用來添加報(bào)頭信息
opener = urllib.request.build_opener()
opener.addheaders=[header]?
data =? opener.open(url).read()
fh = open("test_header","wb")??
fh.write(data)
fh.close()
新聞網(wǎng)站爬取
需求:將新浪新聞首頁(http://news.sina.com.cn/)所有新聞都爬到本地。
思路:先爬首頁,通過正則獲取所有新聞鏈接,然后依次爬各新聞,并存儲(chǔ)到本地。
#!/usr/bin/env python
# _*_ UTF-8 _*_
# author:livan
import urllib.error?
import urllib.request??
url="http://blog.csdn.net/weiwei_pig/article/details/52123738"??
header = ("User-Agent":"Mozilla/5.0? (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)? Chrome/56.0.2924.87 Safari/537.36")
#用來添加報(bào)頭信息
opener = urllib.request.build_opener()
opener.addheaders=[header]?
data =? opener.open(url).read()
fh = open("test_header","wb")??
fh.write(data)
fh.close()
爬蟲防屏蔽手段之代理服務(wù)器
#!/usr/bin/env python
# _*_ UTF-8 _*_
# author:livan
import urllib.request?
import re
url = "http://blog.csdn.net/"
headers = ("User-Agent","Mozilla/5.0? (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)? Chrome/56.0.2924.87 Safari/537.36")
#建一個(gè)瀏覽器opener
opener = urllib.request.build_opener()
#將頭加入到opener中
opener.addheaders=[headers]??
#將opener安裝為全局
urllib.request.install_opener(opener)??
data = urllib.request.urlopen(url).read().decode("utf-8", "ignore")
pat = '<h3? data-mod="popu_430" data- poputype="feed"? data-feed-show="false" data-dsm="post"><a href="(.*?)"'
result = re.compile(pat).findall(data)
for i in range(0, len(result)):
? ? file = str(i)+".html"?
? ? urllib.request.urlretrieve(result[i], filename=file)? ? ? ? ? ? ? ??
? ? print("第"+str(i)+"次爬取成功")
如何做代理:
#!/usr/bin/env python
# _*_ UTF-8 _*_
# author:livan
import urllib.request
def use_proxy(url, proxy_addr):
? ? ?proxy = urllib.request.ProxyHandler({"http":? proxy_addr})
? ? ?opener = urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
? ? ?urllib.request.install_opener(opener)
? ? ?data = urllib.request.urlopen(url).read().decode("utf-8", "ignore")
? ? ?return data
proxy_addr = ["110.73.43.18:8123"]
url = "http://www.baidu.com"
data = use_proxy(url, proxy_addr)
print(len(data))
圖片爬蟲實(shí)戰(zhàn)
在瀏覽器爬取時(shí),有時(shí)不同的瀏覽器會(huì)有不同的查詢結(jié)果,解析出不同的源碼。
首先在“審查元素”中確定元素的重點(diǎn)字段是哪些,然后再在“源碼”中查找對(duì)應(yīng)的圖片位置,確定圖片 url 的規(guī)則。
#!/usr/bin/env python
# _*_ UTF-8 _*_
# author:livan
import urllib.request
import re
keyname = "短裙"
key = urllib.request.quote(keyname)
headers = ("User_Agent", "Mozilla/5.0? (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0")
opener = urllib.request.build_opener()
opener.addheaders=[headers]
urllib.request.install_opener(opener)
for i in range(0, 10):
? ? url = "https://s.taobao.com/search?q="+key+"&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&bcoffset=4&ntoffset=4&p4ppushleft=1%2C48&s="+str(i*44)
? ? data = urllib.request.urlopen(url).read().decode("utf-8", "ignore")
? ? pat = 'pic_url":"//(.*?)"'
? ? imagelist = re.compile(pat).findall(data)
? ? for j in range(0, len(imagelist)):
? ? ? ? thisimg = imagelist[j]
? ? ? ? thisimgurl = "http://"+thisimg
? ? ? ? file = "F:/python_workspace/test/pic/"+str(i)+str(j)+".jpg"
? ? ? ? urllib.request.urlretrieve(thisimgurl, filename=file)
在源碼解決不了的情況下,需要進(jìn)行抓包。作業(yè):千圖網(wǎng)的爬取(可以通過調(diào)試找到報(bào)錯(cuò)原因):
#!/usr/bin/env python
# _*_ UTF-8 _*_
# author:livan
import urllib.request?
import re
for i in range(1,10):
? ? pageurl = "http://www.58pic.com/piccate/3-153-652-"+str(i)+".html"??
? ? data = urllib.request.urlopen(pageurl).read().decode("utf-8", "ignore")
? ? pat = '<a.*?src="(.*?).jpg!"'
? ? imglist = re.compile(pat).findall(data)
? ? for j in range(0, len(imglist)):
? ? ? ? try:
? ? ? ? ? ? thisimg = imglist[j]
? ? ? ? ? ? thisimgurl = thisimg+"_1024.jpg"
? ? ? ? ? ? file = "F:/python_workspace/test/pic2/"+str(i)+str(j)+".jpg"??
? ? ? ? ? ? urllib.request.urlretrieve(thisimgurl, filename=file)
? ? ? ? ? ? print("第"+str(i)+"頁第"+str(j)+"個(gè)圖片爬取成功")
? ? ? ? except urllib.error.URLError as e:
? ? ? ? ? ? if hasattr(e, "code"):
? ? ? ? ? ? ? ? print(e.code)
? ? ? ? ? ? if hasattr(e, "reason"):
? ? ? ? ? ? ? ? print(e.reason)
? ? ? ? except Exception as e:
? ? ? ? ? ? print(e)
抓包分析實(shí)戰(zhàn)(一)
獲取淘寶的評(píng)論信息、騰訊的娛樂新聞信息等需要抓包分析。如何抓取 https 的數(shù)據(jù)包以及騰訊視頻的評(píng)論。
TextView:顯示返回的信息;
通過 fiddler 找到含有評(píng)論的網(wǎng)址,復(fù)制出對(duì)應(yīng)的網(wǎng)址,觀察網(wǎng)址的規(guī)則。
設(shè)置完 fiddler 之后,點(diǎn)擊要爬取的頁面,回到 fiddler 中,確定有 js 內(nèi)容的鏈接:
對(duì)應(yīng)的網(wǎng)址為:
https://rate.tmall.com/list_detail_rate.htm?itemId=42679128869&spuId=315119437&sellerId=2166475645&order=3¤tPage=1&append=0&content=1&tagId=&posi=&picture=&ua=098%23E1hv%2FpvEvbQvUvCkvvvvvjiPP2Lw0jEbPL59AjnEPmPZQj1Pn2L9QjEvR2MwljE8vphvC9vhvvCvpvyCvhQvryGvCzox9WFIRfU6pwet9E7rejZIYExr1EuK46en3OkQrEttpR2y%2BnezrmphQRAn3feAOHPIAXcBKFyK2ixrlj7xD7QHYWsUtE97Kphv8vvvvvCvpvvvvvmCc6Cv2UIvvUnvphvpgvvv96CvpCCvvvmCXZCvhhmEvpvV2vvC9jx2uphvmvvv98GEKUM72QhvCvvvMMGtvpvhvvvvv8wCvvpvvUmm3QhvCvvhvvv%3D&isg=AoKCecM7b7NouHNtRCUm6rar0osk--IFkGgfUsyboPWxHyKZtOPWfQjduSCd&needFold=0&_ksTS=1508769919830_1070&callback=jsonp1071
然后確定其中的 itemId 等字段的內(nèi)容,其中的部分內(nèi)容未必有用處,可以直接刪除,比如 上面 url的 ua 字段。
如果要抓取 https 的數(shù)據(jù):
Fiddler 默認(rèn)只能抓取 HTTP 協(xié)議的網(wǎng)頁,不能抓取 HTTPS 協(xié)議的網(wǎng)頁,而我們很多時(shí)候,都需要抓 HTTPS 協(xié)議的網(wǎng)頁,比如抓淘寶數(shù)據(jù)等。今天,韋瑋老師會(huì)為大家講解如何使用 Fiddler 抓取 HTTPS 協(xié)議的網(wǎng)頁。
打開 Fiddler,點(diǎn)擊“Tools--FiddlerOptions--HTTPS”,把下方的全部勾上,如下圖所示:
然后,點(diǎn)擊 Action,選擇將CA 證書導(dǎo)入到桌面,即第二項(xiàng),導(dǎo)出后,點(diǎn)擊上圖的 ok 保存配置。
然后在桌面上就有了導(dǎo)出的證書,如下所示:
隨后,我們可以在瀏覽器中導(dǎo)入該證書。我們打開火狐瀏覽器,打開“選項(xiàng)--高級(jí)--證書- -導(dǎo)入”,選擇桌面上的證書,導(dǎo)入即可。隨后,Fiddler 就可以抓 HTTPS 協(xié)議的網(wǎng)頁了。如下圖所示。
抓取騰訊視頻的評(píng)論:
下圖為帶評(píng)論的 js 文件(從 fiddler 中獲取):
其中有多個(gè)字段,commentid 等,在點(diǎn)擊“加載更多”時(shí),commentID 會(huì)發(fā)生變化,在第一個(gè)url 的源碼中會(huì)找到下一個(gè)評(píng)論 url 的地址,找到 last 字段,即為下一個(gè) url 的commentid, 以此來構(gòu)造下一個(gè) url。
#!/usr/bin/env python
# _*_ UTF-8 _*_
# author:livan
import urllib.request?
import re
import urllib.error
headers = ("User_Agent", "Mozilla/5.0? (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
urllib.request.install_opener(opener)
comid = "6323280825454961655"
url = "http://coral.qq.com/article/2102904258/comment?commentid="+comid+"&reqnum=20&tag=&callback=jQuery11240200259412840594121508770934137&_=1508770934145"
for i in range(0, 100):
? ? data = urllib.request.urlopen(url).read().decode()
? ? patnext = '"last":"(.*?)"'
? ? nextid = re.compile(patnext).findall(data)[0]
? ? patcom = '"content":"(.*?)",'
? ? comdata? = re.compile(patcom).findall(data)
? ? for j in range(0, len(comdata)):
? ? ? ? print("------第"+str(i)+str(j)+"條評(píng)論內(nèi)容是:")
? ? ? ? print(eval('u"'+comdata[j]+'"'))
? ? ? ? url = "http://coral.qq.com/article/2102904258/comment?commentid="+nextid+"&reqnum=20&tag=&callback=jQuery1124020025941284059412_1508770934137&_=1508770934145"
微信爬蟲實(shí)戰(zhàn)
如何解決微信的限制?
#!/usr/bin/env python
# _*_ UTF-8 _*_
# author:livan
import re
import urllib.request
import time
import urllib.error
#自定義函數(shù),功能為使用代理服務(wù)器爬一個(gè)網(wǎng)址
def use_proxy(proxy_addr, url): #建立異常處理機(jī)制
? ? try:
? ? ? ? req = urllib.request.Request(url)
? ? ? ? req.add_header("User_Agent", "Mozilla/5.0? (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0")
? ? ? ? proxy =? urllib.request.ProxyHandler({'http':proxy_addr})
? ? ? ? opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
? ? ? ? urllib.request.install_opener(opener)
? ? ? ? data =? urllib.request.urlopen(req).read()
? ? ? ? return data
? ? except urllib.error.URLError as e:
? ? ? ? if hasattr(e, "code"):
? ? ? ? ? ? print(e.code)
? ? ? ? if hasattr(e, "reason"):
? ? ? ? ? ? print(e.reason)
? ? ? ? #若為URLError? 異常,延時(shí)10 秒執(zhí)行time.sleep(10)
? ? except Exception as e:
? ? ? ? print("exception:"+str(e))
? ? time.sleep(1)
#設(shè)置關(guān)鍵詞
key = "Python" #設(shè)置代理服務(wù)器,該代理服務(wù)器有可能失效,讀者需要換成新的有效代理服務(wù)器#即通過fiddler中轉(zhuǎn)爬取。
proxy = "127.0.0.1:8888"
#爬多少頁:
for i in range(0, 10):
? ? key =? urllib.request.quote(key)
? ? thispageurl? = "http://weixin.sogou.com/weixin?type=2&query="+key+"&page"+str(i)
? ? #a="http://blog.csdn.net"
? ? thispagedata = use_proxy(proxy, thispageurl)
? ? print(len(str(thispagedata)))
? ? pat1 = '<a href="(.*?)"'
? ? rs1 = re.compile(pat1, re.S).findall(str(thispagedata))
? ? if(len(rs1)==0):
? ? ? ? print("此次("+str(i)+"頁)沒有成功")
? ? ? ? continue? ??
? ? for j in range(0, len(rs1)):
? ? ? ? thisurl? = rs1[j]
? ? ? ? # 提取到的網(wǎng)址與通過瀏覽器實(shí)際跳轉(zhuǎn)的頁面網(wǎng)址不完全一致,通過比#較觀察發(fā) 現(xiàn),爬取的頁面中有amp 字段為多余。
? ? ? ? thisurl = thisurl.replace("amp;", "")
? ? ? ? file = "F:/python_workspace/test/wechat/第"+str(i)+"頁第"+str(j)+"篇文章.html"
? ? ? ? thisdata = use_proxy(proxy, thisurl)
? ? ? ? try:
? ? ? ? ? ? fh = open(file, "wb")
? ? ? ? ? ? fh.write(thisdata)
? ? ? ? ? ? fh.close()?
? ? ? ? ? ? print("第"+str(i)+"頁第"+str(j)+"篇文章成功")
? ? ? ? except Exception as e:
? ? ? ? ? ? print(e)
? ? ? ? ? ? print("第"+str(i)+"頁第"+str(j)+"篇文章失敗")
微信爬蟲的爬取依然是使用瀏覽器,即在搜狗瀏覽器上使用微信網(wǎng)頁版,然后編輯這個(gè)頁面的 url,以獲取內(nèi)容。
多線程爬取實(shí)戰(zhàn) 糗事百科的代碼
#!/usr/bin/env python
# _*_ UTF-8 _*_
# author:livan
import urllib.request?
import re
import urllib.error
headers = ("User_Agent", "Mozilla/5.0? (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
urllib.request.install_opener(opener)
for i in range(1, 2):
? ? url = "https://www.qiushibaike.com/8hr/page/"+str(i)??
? ? pagedata = urllib.request.urlopen(url).read().decode("utf-8","ignore")? ? ? ?
? ? pat = '<div>.*?<span>(.*?)</span>.*?</div>'
? ? datalist = re.compile(pat, re.S).findall(pagedata)
? ? for j in range(0, len(datalist)):
? ? ? ? print("第"+str(i)+"頁第"+str(j)+"個(gè)段子的內(nèi)容是:")
? ? ? ? print(datalist[j])?
將此程序改為多進(jìn)程為:
#!/usr/bin/env python
# _*_ UTF-8 _*_
# author:livan
import urllib.request
import re
import urllib.error
import threading
headers = ("User_Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0)Gecko/20100101 Firefox/53.0")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
urllib.request.install_opener(opener)
class One(threading.Thread):
? ? def __init__(self):
? ? ? ? threading.Thread.__init__(self)
? ? def run(self):
? ? ? ? for i in range(1, 36, 2):
? ? ? ? ? ? url = "https://www.qiushibaike.com/8hr/page/"+str(i)
? ? ? ? ? ? pagedata = urllib.request.urlopen(url).read().decode("utf8","ignore")
? ? ? ? ? ? pat='<div class="content">.*?<span>(.*?)</span>.*?</div>'
? ? ? ? ? ? datalist = re.compile(pat, re.S).findall(pagedata)
? ? ? ? ? ? for j in range(0, len(datalist)):
? ? ? ? ? ? ? ? print("第"+str(i)+"頁第"+str(j)+"個(gè)段子的內(nèi)容是:")
? ? ? ? ? ? ? ? print(datalist[j])
class Two(threading.Thread):
? ? def __init__(self):
? ? ? ? threading.Thread.__init__(self)
? ? def run(self):
? ? ? ? for i in range(0, 36, 2):
? ? ? ? ? ? url = "https://www.qiushibaike.com/8hr/page/"+str(i)
? ? ? ? ? ? pagedata = urllib.request.urlopen(url).read().decode("utf8","ignore")
? ? ? ? ? ? pat='<div class="content">.*?<span>(.*?)</span>.*?</div>'
? ? ? ? ? ? datalist = re.compile(pat, re.S).findall(pagedata)
? ? ? ? ? ? for j in range(0, len(datalist)):
? ? ? ? ? ? ? ? print("第"+str(i)+"頁第"+str(j)+"個(gè)段子的內(nèi)容是:")
? ? ? ? ? ? ? ? print(datalist[j])
one = One()
one.start()
two = Two()
two.start()
老表的福利是什么?
贈(zèng)書一本
(一般在推文頭條(第一條)
文末有贈(zèng)送書籍介紹
有前一天獲獎(jiǎng)讀者信息)
b.留言打卡,滿30天
進(jìn)老表學(xué)習(xí)福利群
書籍、現(xiàn)金、課程統(tǒng)統(tǒng)安排(在當(dāng)天推文的任何一條留言
就算當(dāng)天打卡成功)
昨天最佳留言讀者:楓,
請(qǐng)于2日內(nèi)聯(lián)系微信:jjxksa888,領(lǐng)取獎(jiǎng)勵(lì)。
鼓勵(lì)一下堅(jiān)持學(xué)習(xí) 無謂困難
今日留言主題:
說說你看了本文后的感觸?
或者一句激勵(lì)自己的話?
(字?jǐn)?shù)不少于15字)
說明:最近每日留言贈(zèng)書暫停一段時(shí)間
不過,留言打卡30天進(jìn)福利群
還在繼續(xù),等你~
完整Python基礎(chǔ)知識(shí)要點(diǎn)
總結(jié)
以上是生活随笔為你收集整理的python爬虫入门技术手册的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android bootload漏洞,一
- 下一篇: RemoteTestkit远程真机调试平