爬虫简单上手实战
urllib?庫的基本使?:
所謂??抓取,就是把 URL 地址中指定的?絡資源從?絡流中讀取出來,保存到本地。 在 Python2 中,我們使? urllib2?這個組件來抓取??。在 python3.x 中被改為 urllib.request。
urlopen:
import urllib.request #導入爬蟲用到的模塊 response=urllib.request.urlopen("http://www.baidu.com")#利用這個模塊的urlopen()功能打開百度網(wǎng)址 html=response.read()#把打開的網(wǎng)址讀出來,賦值給html print(html)#打印出來html中的內(nèi)容? 內(nèi)容如下:
#由于內(nèi)容過多就不顯示具體內(nèi)容,我們通過測試html中的長度來證明 print(len(html)) #結(jié)果為 153227? 實際上,如果我們在瀏覽器上打開百度主?, 右鍵選擇“查看源代碼”,你會發(fā)現(xiàn),跟我們剛才打印出來的是?模?樣。也就是說, ? 上?的4?代碼就已經(jīng)幫我們把百度的??的全部代碼爬了下來。
User-Agent:
但是這樣直接?python的 urllib.request給?個?站發(fā)送請求的話,確實略有些唐突了,就好?,?家每家都有?,你以?個路?的身份直接闖進去顯然不是很禮貌。所以有?些站點不喜歡被程序(??為訪問)訪問,有可能會拒絕你的訪問請求。但是如果我們??個合法的身份去請求別??站,顯然?家就是歡迎的。
所以我們就應該給我們的這個代碼加上?個身份,就是所謂的 User-Agent 頭。
User-Agent?顯然如果你不是學習前端專業(yè)的,這個東?確實對于后端開發(fā)?程師是?個頭疼的東?,不過不要緊,不是我們的東?我們只作為了解即可。我們只需要知道,? 不同的瀏覽器 在發(fā)送請求的時候,會有不同的 UserAgent 頭。瀏覽器 就是互聯(lián)?世界上 被允許的身份 。那么如果你不想你的爬?代碼成為?個路?,你需要偽裝成?個被公認的瀏覽器 。偽裝的辦法就是給??的請求加上?個對應的 User-Agent 頭。下面來一段代碼。
import urllib.request url = "http://www.baidu.com" header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36"} req=urllib.request.Request(url,headers=header) resonse=urllib.request.urlopen(req) html=resonse.read() print(len(html)) 解釋一下上面的代碼。 import urllib.request #導入爬蟲用到的庫 url = "http://www.baidu.com" #這里是需要爬取的網(wǎng)站,用url保存一下 #下面這個是網(wǎng)頁的頭,就是我們模擬的一個身份地址,有了這個就可以正常的訪問網(wǎng)頁了 下面講解一下怎么找到這個東西: 方法很多,博主常用的是:進入百度的首頁,按下F12,你會看到網(wǎng)頁源代碼,接下來看一下最上面一行有沒有Network,有沒有你都按F5刷新一下,然后按照接下里給的步驟找到,全部復制下來。 header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36"} #用Request的方法去模擬用戶請求 req=urllib.request.Request(url,headers=header) 接下里正常操作就行第二步里面的只要找到后綴帶有.js的都可以。
案例:批量爬取??數(shù)據(jù)
?先我們創(chuàng)建?個 python?件, tiebaSpider.py,我們要完成的是,輸??個百度貼吧的地址,?如百度貼吧 LOL 吧 ?第??:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0 ?這個是 lol 吧的第??的 url 地址,如果打開第??,你會發(fā)現(xiàn)他的 url 如下: 第??: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50 ?第三?: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100發(fā)現(xiàn)規(guī)律了吧,貼吧中每個??不同之處,就是 url 最后的 pn 的值,其余的都是?樣的,我們可以抓住這個規(guī)律。
簡單寫?個?爬?程序,來爬取百度 LOL 吧的所有??。
我們已經(jīng)之前寫出?個爬取?個??的代碼。現(xiàn)在,我們可以將它封裝成?個?函數(shù) loadPage,供我們使?。
def loadPage(url): ''' 通過 URL 請求爬取到 html 靜態(tài)??源代碼 url:需要爬取的 url 地址 '''req = urllib.request.Request(url)response = urllib.request.urlopen(req)html = response.read()return html接下來,我們寫?個百度貼吧爬?接?,我們需要傳遞 3 個參數(shù)給這個接?, ?個是我們要爬取的 url 地址,以及起始?碼和終??碼,表示要爬取?碼的范圍。一般使用for循環(huán)自動爬取多個網(wǎng)頁即可。
def tiebaSpider(url, beginPage, endPage): ''' 百度貼吧爬?核?程序: url: 要爬取的 url 地址 beginPage: 爬?貼吧的起始?數(shù) endPage: 爬?貼吧的終??數(shù) '''user_agent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;" # IE9.0 的 User-Agentheaders = {"User-Agent":user_agent}for i in range(beginPage, endPage+1):pn = 50 * (i - 1)html = loadPage(url+str(pn)) #構(gòu)造成一個新的網(wǎng)址,只要改變pn的不同,就能進入不同的頁面最后如果我們希望將爬取到了每?的信息存儲在本地磁盤上,我們可以簡單寫?個存儲?件的接?。
def writeFile(file_name, text): ''' 將字符串內(nèi)容寫到?件中: file_name: ?件路徑 text: 要寫進的字符串 print "正在存儲?件" + file_name '''f = open(file_name, 'w+')f.write(text)f.close()ok,接下來就是寫?個 main 函數(shù)吧,然后提示?戶輸?即將爬取的百度貼吧 url 地址。 ( 注意 :百度貼吧最后?碼” pn= “后的數(shù)字,這些數(shù)字為我們傳?的?碼參數(shù),所以我們再提供的時候不能包括數(shù)字)
if __name__ == ' __main__ ':tiebaurl = str(input('請輸?貼吧的地址, 去掉 pn=后?的數(shù)字:'))beginPage = int(input('請輸?開始的?數(shù)'))endPage = int(input('請輸?結(jié)束的?數(shù)'))tiebaSpider(tiebaurl, beginPage, endPage)writeFile("寫文件夾目錄地址",tiebaSpider)? 綜上, 全部代碼完成。好了,最后我們測試?下:
請輸?貼吧的地址, 去掉 pn=后?的數(shù)字: http://tieba.baidu.com/f?kw=lol&i e=utf-8&pn= 請輸?開始的?數(shù) 5 請輸?結(jié)束 的?數(shù) 10 正在下載第 5 個??正在存儲?件 5.html 正在下載第 6 個?? 正在存儲?件 6.html 正在下載第 7 個?? 正在存儲?件 7.html 正在下載第8 個?? 正在存儲?件8.html 正在下載第 9 個?? 正在存儲?件9.html 正在下載第 10個?? 正在存儲?件10.html總結(jié):
其實很多?站都是這樣的,當前?址下會有?個 html??,分別對應?址后的??序號。找出網(wǎng)址的特點,構(gòu)造出來共同特征就能讓爬蟲持續(xù)爬取。一個簡單的爬?程序就可以批量獲取?站??源碼,然后我們就可以從中篩選??想要的數(shù)據(jù)信息了。
總結(jié)
- 上一篇: PHP操作Redis常用技巧
- 下一篇: GitHub中watch、star、fo