1. 程式人生 > >爬蟲基礎20%知識,開發簡單爬蟲

爬蟲基礎20%知識,開發簡單爬蟲

1.輕量級爬蟲,不需要登入、頁面不會使用Ajax非同步載入方法,只是簡單的靜態頁面。
2.爬蟲排程端——>URL管理器——>網頁下載器——>頁面解析器——>有效資料
3.URL管理器實現方式:記憶體、關係資料庫SQL 、快取資料庫Redis。
4.頁面下載器:使用urllib.request.urlope().
5.網頁解析器:5.1正則表示式、5.2html.parser、5.3 BeautifulSoup 5.4 lxml
第一種是模糊匹配,後面三種採用結構化解析DOM樹。

#網頁下載器python3
import urllib.request
response =
urllib.request.urlopen('http://www.baidu.com') print(response.getcode())#獲取狀態碼,200表示成功 html = response.read()#獲取頁面html字元流 #爬取千圖網的網站圖片,只能看到示例圖片,未能爬取原始畫質圖片。 from bs4 import BeautifulSoup import urllib.request import re html_doc = urllib.request.urlopen('http://www.58pic.com/tupian/huidutu.html') soup = BeautifulSoup(
html_doc,#HTML文件字串 'html.parser',#HTML解析器 from_encoding = 'urf8'#HTML文件編碼 ) #find_all(標籤名稱, 屬性, 文字) jpg_url = [] links = soup.find_all('img',src = re.compile("^http://pic.qiantucdn.com")) for x in links: jpg_url.append(x['src'][0:-6])#最後六個字元不符合要求,捨棄 #重點,對於有下劃線的屬性處理,放在字典裡。
links = soup.find_all('img', attrs = {'data-original':re.compile("^http://pic.qiantucdn.com/58pic")}) for x in links: jpg_url.append(x['data-original'][0:-6]) print(len(jpg_url)) #獲取的圖片地址,下載圖片到本地 i = 0 for url in jpg_url: if url[-4:] == '.jpg':#有一張錯誤地址 f = open(str(i)+'.jpg', 'wb+')#以二進位制方式開啟檔案,沒有就建立一個。 req = urllib.request.urlopen(url) buf = req.read() f.write(buf) i += 1

學習的方面
1.注意對網頁標籤的處理,處理到最簡形式儲存如列表,可以減少下面的操作。
2.正則還是要懂的,可以方便對字串等形式的刪選。

錯誤:
TypeError: write() argument must be str, not bytes
網上搜索才發現原來是檔案開啟的方式有問題。
之前檔案開啟的語句是:
f = open(str(i)+’.jpg’, ‘w’)
然後使用二進位制方式開啟就沒有這個問題:
f = open(str(i)+’.jpg’, ‘wb+’)
產生問題的原因是因為儲存方式預設是二進位制方式。