從零開始學Python 三(網絡爬蟲)

本章由網絡爬蟲的編寫來學習python。首先寫幾行代碼抓取百度首頁,提提精神,代碼如下:

import urllib.request

file=urllib.request.urlopen("http://www.baidu.com")

data=file.read()

handle=open("code/python/baidu.html","wb")

handle.write(data)

handle.close()

除了第一行導入第三方包之外,我們用5行代碼實現了一個簡單的程序:讀取百度首頁並存儲在本地制定文件。下面來詳細介紹代碼:

1.import urllib.request

urllib庫是python的一個操作url功能強大的庫,經常用在爬蟲程序中。使用上述代碼,我們便可以在程序中打開並爬取網頁。

2.urllib.request.urlopen("http://www.baidu.com")

使用urlopen方法,參數爲想爬取的網頁。成功之後,把爬取的內容賦值給file變量。

另,讀取file數據有2種方法:

file.read() //讀取全部數據
file.readline()//讀取一行數據

3.handle=open("code/python/baidu.html","wb")

通過open函數打開一個文件,並且以「wb」即二進制寫入方式打開,然後賦值給hadle變量。需要注意首先建立對應的文件夾和文件,否則無法運行。錯誤如下:

Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    fhandle=open("/code/python","wb")
FileNotFoundError: [Errno 2] No such file or directory:

4.handle.write(data)

使用write()方法將data數據寫入文件

5.handle.close()

關閉文件。操作完文件之後一定要記得關閉。至此,我們就把百度首頁保存到了本地文件:

打開文件顯示如下:

 其實,上面5行代碼可以精簡爲1行,功能不變但代碼更少:

>>> import urllib.request
>>> 
>>> urllib.request.urlretrieve("http://www.baidu.com","code/python/baidu2.html")
('code/python/baidu2.html', <http.client.HTTPMessage object at 0x1060f8240>)
>>> 

 

接着,讓我們更進一步,用程序模擬百度搜索操作。

當我們在百度上查詢時,是在輸入框中輸入關鍵字,然後點擊回車,接着百度返回搜索結果。這一系列操作通過http語音描述如下:使用get方法,通過"http://www.baidu.com/s?wd="+關鍵字調用百度服務。明白背後原理之後,我們用python模擬搜索「逃稅」的操作,代碼如下:

>>> url="http://www.baidu.com/s?wd="
>>> key="逃稅"
>>> key_code=urllib.request.quote(key)
>>> urllib.request.urlretrieve(url+key_code,"code/python/baidu逃稅.html")
('code/python/baidu逃稅.html', <http.client.HTTPMessage object at 0x1060f8f98>)

打開本地文件後,發現和在百度上輸入一模一樣。

上面代碼有個關鍵點:URL標準中只允許一部分ASCII字符(字母、數字),其他的比如漢字不符合標準。因此不能直接在url後面拼接漢字,需要使用quote()方法進行編碼。相應的,如果需要對編碼的網址進行解碼,可以使用unquote()方法。

 

最後,以一個不完整的圖片爬蟲程序結束。

現在,我們想把淘寶網上連衣裙分類裏的圖片全部下載到本地。首先,找到目標網址(https://s.taobao.com/list?spm=a217f.8051907.312003.5.19833308A93qss&q=%E8%BF%9E%E8%A1%A3%E8%A3%99&cat=16&seller_type=taobao&oetag=6745&source=qiangdiao&bcoffset=12&s=180)。打開開發者工具,查看圖片地址。

可以看到,我們已經拿到了圖片路徑,在瀏覽器上加上前綴"http://"就可以打開。

因此,程序邏輯如下:

循環獲取網址內容->對於每個網址找到需要的圖片->構造圖片路徑,下載到本地

具體代碼請等下期內容。