Python官方提供了用於編寫網絡爬蟲的包 urllib.request, 我們主要用它進行打開url,讀取url里面的內容,下載里面的圖片。
分以下幾步:
step1:用urllib.request.urlopen打開目標網站
step2:由於urllib.request.urlopen返回的是一個http.client.HTTPResponse object,無法直接讀取里面的內容,所以直接調用該對象的方法read(),獲取到頁面代碼,存到html里
step3:構建正則表達式,從頁面代碼里提取出圖片url地址。
step4:根據圖片url地址,用urllib.request.retrieve下載到本地
容易出錯的地方:
1:python2.x和python3.x中,urlopen具體在哪個包里是不一樣的。如果你要在python2.x上實現,要自行百度正確的包。
2:最容易出錯的地方是正則表達式,容易出現匹配錯誤。我程序里寫的正則表達式,在目前的網址里是正確的,如果是其他網址可能還會出問題,要具體問題具體分析,去debug。
比如如果img_re=re.compile(r'(?<=src=)"\w+?jpg"')的話,會匹配成""http://tieba.........."
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import
urllib.request
import
re
def
getHtml(url):
#print("正在打開網頁並獲取....")
page
=
urllib.request.urlopen(url)
Html
=
str
(page.read())
print
(
"成功獲取...."
)
return
Html
def
getImg(html):
img_re
=
re.
compile
(r
'(?<=src=")\S+?jpg'
)
#img_re=re.compile(r'src="(.*?\.jpg)"')
print
(
"the type of html is :"
,
type
(html))
img_list
=
img_re.findall(html)
print
(
"len(img_list)="
,
len
(img_list))
print
(
"img_list[0]="
,img_list[
0
])
print
(
"正在下載圖片......"
)
for
i
in
range
(
len
(img_list)):
print
(
"img_list[%d]=%s"
%
(i,img_list[i]))
urllib.request.urlretrieve(img_list[i],
'%s.jpg'
%
i)
print
(
"完成圖片下載......"
)
print
(
"一共抓到了%d張圖片"
%
len
(img_list))
if
__name__
=
=
"__main__"
:
url_baidu
=
"http://tieba.baidu.com/f?kw=%B0%A2%C9%AD%C4%C9"
html
=
getHtml(url_baidu)
getImg(html)
|