寫一個簡單的python爬蟲程序,爬取一下百度圖片

申明
本文章僅供學習使用,若讀者利用該方法進行違法犯罪活動與本人無關。
爬蟲已經開始違法了,所以需要謹慎使用。
以下開始正文


首先,import幾個需要用到的包

import requests        #需要用這個包向百度發送請求
import re              #需要用這個包進行正則匹配
import time            #休眠一下,以免給服務器造成太大壓力

requests在這裏主要作用是向百度發送請求,也就是模仿人類的操作進行訪問,有post和get兩個方法,在這裏我們用get方法就行。

然後,開始向百度發送請求,這裏當然需要百度圖片的鏈接,先訪問一下百度圖片看看鏈接張什麼樣。在這裏插入圖片描述
url欄長這樣:

http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=皮卡丘

剔除一些不必要的內容之後,可以長這樣

http://image.baidu.com/search/index?tn=baiduimage&word=皮卡丘

不信你可以試試。

然後對url分析一下,前面的http://image.baidu.com/search/index?tn=baiduimage肯定是固定格式,不能變的,後面的word=皮卡丘很明顯就是我們搜索的關鍵詞。url解決了,接下去向百度發送請求。代碼如下:

html = requests.get(url)
html.encoding = html.apparent_encoding    #這裏可以對需要爬取的頁面查看一下源碼,一般都是utf-8,但是不全是。
html = html.text    #這裏需要獲取對應的文本,以便後面進行正則匹配操作

在這裏插入圖片描述
接下來的操作,是對源碼進行操作,這裏最好有一些web前端的知識,不會的話至少要回查看源碼(最簡單的操作就是在網址欄前面加view-source

首先,在源碼頁搜一下jpg(百度圖片的後綴,先找到圖片的鏈接)
在這裏插入圖片描述
隨便抓一個鏈接出來分析一下:

{"ObjURL":"http:\/\/tiebapic.baidu.com\/forum\/pic\/item\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg","ObjUrl":"http:\/\/tiebapic.baidu.com\/forum\/pic\/item\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg"

把裏面的http:\/\/tiebapic.baidu.com\/forum\/pic\/item\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg抓出來,訪問一下,發現可以訪問。多試幾個,發現只有objURL開頭的才能訪問,但是objURL開頭的也不一定能訪問。不管了,先將所有的以

"ObjURL":"xxxx"

格式的鏈接全部找出來,這時候就需要利用正則匹配了。代碼如下:

urls = re.findall('"objURL":"(.*?)"',html,re.S)    #導入的re包就在這裏用

要注意,re.findall匹配出來的數據是一個列表,需要用for循環一個個的訪問:

i = 0
for url in urls:
	time.sleep(3)    #休眠3秒
	imag = requests.get(url,timeout = 6).content
	 #timeout代表每次request請求最多6秒,不然萬一卡住了呢
	if imag:
		with open(str(i) + '.jpg','wb') as f:
			print('正在下載第 %d 張圖片:%s' % (i + 1,url))
			f.write(imag)
		i += 1
	else:
		print('鏈接超時,圖片下載失敗')
print('圖片下載成功')

一個最最簡單的爬蟲寫好了,但是稍微有一點點錯誤就會報錯,沒有所謂的健壯性,怎麼改進爬蟲呢,將在下一篇文章進行講解。
完整代碼如下,大家可以自行體驗一下:

import requests
import re
import time

url = 'http://image.baidu.com/search/index?tn=baiduimage&word=皮卡丘'
html = requests.get(url)
html.encoding = html.apparent_encoding
html = html.text
urls = re.findall('"objURL":"(.*?)"',html,re.S)
i = 0
for url in urls:
	time.sleep(3)    #休眠3秒
	imag = requests.get(url,timeout = 6).content
	 #timeout代表每次request請求最多6秒,不然萬一卡住了呢
	if imag:
		with open(str(i) + '.jpg','wb') as f:
			print('正在下載第 %d 張圖片:%s' % (i + 1,url))
			f.write(imag)
		i += 1
	else:
		print('鏈接超時,圖片下載失敗')
print('圖片下載成功')


注意:最後送大家一套2020最新企業Pyhon項目實戰視頻教程,點擊此處 進來獲取 跟着練習下,希望大家一起進步哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章