urllib3下簡單爬蟲的建立流程。
阿新 • • 發佈:2018-12-17
Y25
# 匯入urllib3模組,os檔案操作模組,time時間模組
import urllib3, os, time
# 匯入lxml庫中的額etree,方便解析資料
from lxml import etree
# 匯入程序池
from multiprocessing import Pool
# 建立網路請求物件
http = urllib3.PoolManager()
# 禁用urllib3警告(urllib3在進行https請求時,可能會丟擲對應的警告,可以設定disable_warnings禁用對應的警告)
urllib3.disable_warnings()
# 模擬瀏覽器訪問網頁
header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36', 'Content-type':'text/json'}
# 定義函式完成網路資料爬取(可傳入回撥函式和網路連結,或者直接傳入網路連結)
def get_net_data(url, method='get', callBack=None):
# 傳送網路請求
response = http.request( method,url,headers=header, retries=5)
# 回撥函式不為空,返回對應資料
if callBack is not None:
callBack(response.data)
# 只傳入網路連結的下,直接利用etree方法,解析提取html頁面資料的方式。轉化為節點樹的方式
else:
return etree.HTML(response.data)
# 定義函式完成頁面資料下載
def download_page(url):
# 呼叫get_net_data函式爬取對應網站資料
data = get_net_data(url)
# 根據對應的節點路徑表示式來選取網頁中的節點或節點集
srcs = data.xpath("//ul[@class='new-img']/ul/li/a/img/@src")
titles = data.xpath("//ul[@class='new-img']/ul/li/a/@title")
for j in range(len(srcs)):
os.mkdir('img/{0}'.format(titles[j]))
response = http.request('get',srcs[j],headers=header)
f = open('img/{0}/{1}'.format(titles[j],srcs[j].split('-')[-1]),'wb+')
f.write(response.data)
print('第%s張下載完成'%j)
f.close()
# 設定主程序
if __name__ == '__main__':
url = "http://www.7160.com/yulebagua/"
# 建立程序池,實現多個程序同步執行的操作,並且方便管理多程序。(實現5個程序同時執行任務)
pool = Pool(5)
# apply_async用來向程序池中新增一個非同步執行的程序。 apply則用來向程序池中新增一個同步執行的融程序。
pool.apply_async(download_page, args=(url,))
# 關閉程序池,一旦程序池呼叫close操作,此後,程序池不再接受任何程序任務。
pool.close()
# 設定主程序等待子程序任務執行完畢
pool.join()
結果展示:
個人小結,定有不足,歡迎指點。 謝謝~