前言
很多人學(xué)習(xí)Python就是為了寫爬蟲的,給大家的印象就是Python=爬蟲,既然如此,那我們也從最簡(jiǎn)單的爬蟲開始學(xué)習(xí)吧,
先介紹一波爬蟲的原理吧,爬蟲也就是Python寫的腳本,對(duì)特定的url提取需要的信息
所以爬蟲總共飛為三部,獲取頁(yè)面數(shù)據(jù),解析頁(yè)面數(shù)據(jù),保存數(shù)據(jù)。
網(wǎng)址處理器,用來(lái)提供抓取網(wǎng)址對(duì)象
網(wǎng)頁(yè)解析器,用來(lái)提取網(wǎng)頁(yè)中稀疏分散著的目標(biāo)數(shù)據(jù)
數(shù)據(jù)存儲(chǔ)器,用來(lái)保存提取的數(shù)據(jù)。
網(wǎng)址處理器
做爬蟲前,先分析要抓網(wǎng)頁(yè)的網(wǎng)址規(guī)律,通過(guò)規(guī)律構(gòu)建每一個(gè)待抓頁(yè)面的網(wǎng)址
網(wǎng)址解析器
做爬蟲,先分析一個(gè)網(wǎng)址上的數(shù)據(jù)提取規(guī)則,推而廣之將規(guī)律應(yīng)用到待爬網(wǎng)站的所有的網(wǎng)址上。注意可能有些網(wǎng)頁(yè)數(shù)據(jù)是空的,應(yīng)該考慮try。。。except。。。處理異常情況出現(xiàn)。
數(shù)據(jù)存儲(chǔ)器
入門的爬蟲,要爬的數(shù)據(jù)量一般不是很大,可以用txt,csv等進(jìn)行保存,保存時(shí)注意讀寫方式(‘a(chǎn)’ , w',‘a(chǎn)+’),推薦使用'a+'。,編碼方式使用utf-8即
f = open(path,'a+',encoding='utf-8')來(lái)建保存數(shù)據(jù)的文件。
爬蟲注意事項(xiàng):
1、爬蟲的訪問(wèn)速度不要太快,盡量使用time.sleep(1),降低訪問(wèn)網(wǎng)站的頻率,做有道德合法公民。如果你太狠了,造成人家服務(wù)器癱瘓,屬于犯法行為。
2、咱們的訪問(wèn)的網(wǎng)頁(yè)數(shù)目比較少,如果特別多,訪問(wèn)到一定程度之后,人家網(wǎng)站可能就封鎖你,因?yàn)槟阌玫氖莗ython訪問(wèn)的。
3、即使使用了上面兩種策略,人家仍然封鎖你了,那么要用到代理服務(wù)器抓數(shù)據(jù),讓網(wǎng)站不知道你是誰(shuí),也就沒(méi)法封鎖你了。
一個(gè)基礎(chǔ)的爬蟲就是由這三部分構(gòu)成,爬蟲去提取信息和人為的提取信息,還是有很大的不同的,所以,我們需要和網(wǎng)站管理者斗智斗勇,讓自己的爬蟲盡量繞過(guò)監(jiān)管,不被封了,
我們有三種方法:
偽裝請(qǐng)求報(bào)頭(request header)
減輕訪問(wèn)頻率,速度(模仿的和人為的一樣)
使用代理IP
那我們就需要使用代理,并且,讓爬蟲的行為和人為的更像,
例子
我們爬取淘寶的評(píng)論
第一步,我們要找到評(píng)論的網(wǎng)址,分析網(wǎng)址特點(diǎn)。
淘寶評(píng)論這種動(dòng)態(tài)網(wǎng)頁(yè),在靜態(tài)源碼中是找不到評(píng)論數(shù)據(jù)的,因?yàn)橄裉詫氝@樣的大公司,數(shù)據(jù)太多了,他們使用ajax請(qǐng)求來(lái)顯示數(shù)據(jù),我們可以進(jìn)行抓包,來(lái)分析數(shù)據(jù)
就拿我最近購(gòu)買的一個(gè)物品的網(wǎng)址吧, 格力取暖器小太陽(yáng)遠(yuǎn)紅外電暖器家用電暖氣辦公室速熱電熱取暖迷你
打開該網(wǎng)址,打開評(píng)論。如圖中紅色圈中的評(píng)論,分析發(fā)現(xiàn),在網(wǎng)頁(yè)源碼中查找不到。

我們打開瀏覽器的開發(fā)者模式

點(diǎn)擊消息頭,紅方框中的請(qǐng)求網(wǎng)址就是這個(gè)評(píng)論數(shù)據(jù)包傳遞的網(wǎng)址

看起來(lái)網(wǎng)址太長(zhǎng),太復(fù)雜(稍安勿躁),那么先復(fù)制網(wǎng)址,在瀏覽器上打開看看是什么東西,復(fù)雜的網(wǎng)址中,有些亂七八糟的可以刪除,有意義的部分保留。切記刪除一小部分后先嘗試能不能打開網(wǎng)頁(yè),如果成功再刪減,直到不能刪減。最后保留下來(lái)的網(wǎng)址,如下https://rate.tmall.com/list_detail_rate.htm?itemId=558380648676&spuId=869212966&sellerId=619549442&order=3&callback=jsonp979¤tPage=1
currentPage=1意思是當(dāng)前頁(yè)碼是第一頁(yè)。如果改動(dòng)為currentPage=3表示是第三頁(yè)。
第二步,分析數(shù)據(jù)
import requests
import json
import time
headers = {
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
}
base_url = 'https://rate.tmall.com/list_detail_rate.htm?itemId=558380648676&spuId=869212966&sellerId=619549442&order=3&callback=jsonp979'
#在base_url后面添加¤tPage=1就可以訪問(wèn)不同頁(yè)碼的評(píng)論
#抓取98頁(yè)評(píng)論
for i in range(2, 98, 1):
url = base_url + '¤tPage=%s' % str(i)
#將響應(yīng)內(nèi)容的文本取出
r = requests.get(url, headers=headers)
tb_req = r.text[12:-1]
#print(type(tb_req))
#print(tb_req)
#將str格式的文本格式化為字典
Data = json.loads(tb_req)
#print(type(Data))
for p in range(1, 20, 1):
print(Data["rateDetail"]["rateList"][p]['rateContent'])
time.sleep(1)
在這個(gè)案例中,數(shù)據(jù)就是類似于字典的數(shù)據(jù),print(type(tb_req))查看數(shù)據(jù)類型,大部分是src,我們需要用dict[key]這種方式獲取我們想要的數(shù)據(jù)
這里首先要將str轉(zhuǎn)換為dict,解決辦法有兩個(gè):
方法一:
import json
Data = json.loads(r.text)
方法二:
直接使用requests的方法
Data = r.json()
第三步,保存數(shù)據(jù)。
import os
獲取當(dāng)前代碼所在的文件夾路徑
path = os.getcwd()
filename = '淘寶評(píng)論.txt'
file = path + '/' + filename
f = open(file, 'a+', encoding='utf-8')
文本寫入txt文件
f.write(要寫入的數(shù)據(jù))
待續(xù)----------------------------------------------------------------------------------------------------------------------------