一、什么是爬蟲?
網(wǎng)絡(luò)爬蟲(又被稱為網(wǎng)頁蜘蛛,網(wǎng)絡(luò)機(jī)器人,在FOAF社區(qū)中間,更經(jīng)常的稱為網(wǎng)頁追逐者),是一種按照一定的規(guī)則,自動(dòng)地抓取萬維網(wǎng)信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動(dòng)索引、模擬程序或者蠕蟲。
其實(shí)通俗的講就是通過程序去獲取web頁面上自己想要的數(shù)據(jù),也就是自動(dòng)抓取數(shù)據(jù)。
你可以爬去妹子的圖片,爬取自己想看看的視頻。。等等你想要爬取的數(shù)據(jù),只要你能通過瀏覽器訪問的數(shù)據(jù)都可以通過爬蟲獲取
二、爬蟲的本質(zhì)
模擬瀏覽器打開網(wǎng)頁,獲取網(wǎng)頁中我們想要的那部分?jǐn)?shù)據(jù)
瀏覽器打開網(wǎng)頁的過程:
當(dāng)你在瀏覽器中輸入地址后,經(jīng)過DNS服務(wù)器找到服務(wù)器主機(jī),向服務(wù)器發(fā)送一個(gè)請(qǐng)求,服務(wù)器經(jīng)過解析后發(fā)送給用戶瀏覽器結(jié)果,包括html,js,css等文件內(nèi)容,瀏覽器解析出來最后呈現(xiàn)給用戶在瀏覽器上看到的結(jié)果
所以用戶看到的瀏覽器的結(jié)果就是由HTML代碼構(gòu)成的,我們爬蟲就是為了獲取這些內(nèi)容,通過分析和過濾html代碼,從中獲取我們想要資源(文本,圖片,視頻.....)
三、爬蟲的基本流程
發(fā)起請(qǐng)求
通過HTTP庫向目標(biāo)站點(diǎn)發(fā)起請(qǐng)求,也就是發(fā)送一個(gè)Request,請(qǐng)求可以包含額外的header等信息,等待服務(wù)器響應(yīng)
獲取響應(yīng)內(nèi)容
如果服務(wù)器能正常響應(yīng),會(huì)得到一個(gè)Response,Response的內(nèi)容便是所要獲取的頁面內(nèi)容,類型可能是HTML,Json字符串,二進(jìn)制數(shù)據(jù)(圖片或者視頻)等類型
解析內(nèi)容
得到的內(nèi)容可能是HTML,可以用正則表達(dá)式,頁面解析庫進(jìn)行解析,可能是Json,可以直接轉(zhuǎn)換為Json對(duì)象解析,可能是二進(jìn)制數(shù)據(jù),可以做保存或者進(jìn)一步的處理
保存數(shù)據(jù)
保存形式多樣,可以存為文本,也可以保存到數(shù)據(jù)庫,或者保存特定格式的文件
四、什么是Requests
Requests是用python語言基于urllib編寫的,采用的是Apache2 Licensed開源協(xié)議的HTTP庫
如果你看過上篇文章關(guān)于urllib庫的使用,你會(huì)發(fā)現(xiàn),其實(shí)urllib還是非常不方便的,而Requests它會(huì)比urllib更加方便,可以節(jié)約我們大量的工作。(用了requests之后,你基本都不愿意用urllib了)一句話,requests是python實(shí)現(xiàn)的最簡(jiǎn)單易用的HTTP庫,建議爬蟲使用requests庫。
默認(rèn)安裝好python之后,是沒有安裝requests模塊的,需要單獨(dú)通過pip安裝
五、Requests 庫的基礎(chǔ)知識(shí)
我們通過調(diào)用Request庫中的方法,得到返回的對(duì)象。其中包括兩個(gè)對(duì)象,request對(duì)象和response對(duì)象。

request對(duì)象就是我們要請(qǐng)求的url,response對(duì)象是返回的內(nèi)容
六、Requests的安裝
1.強(qiáng)烈建議大家使用pip進(jìn)行安裝:pip insrall requests
2.Pycharm安裝:file-》default settings-》project interpreter-》搜索requests-》install package-》ok
七、Requests庫實(shí)的操作例
1、京東商品的爬取--普通爬取框架
import requests
url = "https://item.jd.com/2967929.html"
try:
? ? r = requests.get(url)
? ? r.raise_for_status()
? ? r.encoding = r.apparent_encoding
? ? print(r.text[:1000])
except:
? ? print("爬取失?。?)
2、亞馬遜商品的爬取--通過修改headers字段,模擬瀏覽器向網(wǎng)站發(fā)起請(qǐng)求
import requests
url="https://www.amazon.cn/gp/product/B01M8L5Z3Y"
try:
? ? kv = {'user-agent':'Mozilla/5.0'}
? ? r=requests.get(url,headers=kv)
? ? r.raise_for_status()
? ? r.encoding=r.apparent_encoding
? ? print(r.status_code)
? ? print(r.text[:1000])
except:
? ? print("爬取失敗")
3、百度/360搜索關(guān)鍵詞提交--修改params參數(shù)提交關(guān)鍵詞
import requests
url="http://www.baidu.com/s"
try:
? ? kv={'wd':'Python'}
? ? r=requests.get(url,params=kv)
? ? print(r.request.url)
? ? r.raise_for_status()
? ? print(len(r.text))
? ? print(r.text[500:5000])
except:
? ? print("爬取失敗")
4、網(wǎng)絡(luò)圖片的爬取和存儲(chǔ)--結(jié)合os庫和文件操作的使用
import requests
import os
url="http://tc.sinaimg.cn/maxwidth.800/tc.service.weibo.com/p3_pstatp_com/6da229b421faf86ca9ba406190b6f06e.jpg"
root="D://pics//"
path=root + url.split('/')[-1]
try:
? ? if not os.path.exists(root):
? ? ? ? os.mkdir(root)
? ? if not os.path.exists(path):
? ? ? ? r = requests.get(url)
? ? ? ? with open(path, 'wb') as f:
? ? ? ? ? ? f.write(r.content)
? ? ? ? ? ? f.close()
? ? ? ? ? ? print("文件保存成功")
? ? else:
? ? ? ? print("文件已存在")
except:
? ? print("爬取失敗")
最后:異常處理
在你不確定會(huì)發(fā)生什么錯(cuò)誤時(shí),盡量使用try...except來捕獲異常所有的requests exception:
import requests
from requests.exceptions import ReadTimeout,HTTPError,RequestException
try:
? ? response = requests.get('http://www.baidu.com',timeout=0.5)
? ? print(response.status_code)
except ReadTimeout:
? ? print('timeout')
except HTTPError:
? ? print('httperror')
except RequestException:
? ? print('reqerror')