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