Python網(wǎng)絡(luò)爬蟲一

前言

很多人學(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è)源碼中查找不到。


image.png

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


image.png

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


image.png

網(wǎng)址如下
https://rate.tmall.com/list_detail_rate.htm?itemId=558380648676&spuId=869212966&sellerId=619549442&order=3&currentPage=1&append=0&content=1&tagId=620&posi=-1&picture=0&ua=098%23E1hvd9v9vNpvUpCkvvvvvjiPPL5WsjrWRFFptjrCPmPvAj1PR2cpsjrnPLzw1jEvRUhCvmnptzXw6ldNz63FkS1fYrM4zgbw5%2BAqJQnqg%2BFFkt2ok7DX82yCvvpvvhCvCQhvCYMNzn1IdDKrvpvEvUjegi9vC1mPdphvmpmviu8cvvXJf46Cvvyv9Rdur9mH0eWjvpvjzYMwzVZW7syCvvpvvhCvCQhvCYMNzn1D2UkrvpvEvUHAw%2Fpv3apdRphvCvvvphvtvpvhvvCvp2yCvvpvvhCv9phvHnMSfSARcnMNWbs1MHrZztf5zr1%2FdphvmpvChCoNvvxAe46CvvG29pIRcpvHXlITW6JHALu5vpvhvvCCB2yCvvpvvhCv2QhvCvvvvvvCvpvVvvBvpvvvKphv8vvvphvvvvvvvvCHBpvvvVZvvhxHvvvC4vvvBZZvvvjxvvCHBpvvva7ivpvUvvCCUZW2P%2F7EvpvVvpCmpYFhmphvLUHvdugaaB465dUfUzcGeCkwVcxPAnp4e3Oqb64B9Cka%2BfvsxI2hV16t%2BFBCAfyp%2Bu6OjomxfXkKDfUf8c7Q%2Bu6Xd5lNaO97%2Bu0OjomjvpvhvUCvp86Cvvyv9PLQyvmHkZJrvpvEvvjRsMpv3Zz59phv2nM5JN1t7rMNWP1GzUhCvvsNtzdGFDdNzsvnEaQtvpvhvvCvp86Cvvyv9bm0ypvV0tervpvEvvh0WGyv3e33&isg=AhYWvV4HULPAp2QLtaQxllVKZ8zYH1uJ1i0ua4B-bfnUQ7Ld6UZKAQJxr-lU&itemPropertyId=&itemPropertyIndex=&userPropertyId=&userPropertyIndex=&rateQuery=&location=&needFold=0&_ksTS=1515331711145_2121&callback=jsonp2122

看起來(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&currentPage=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后面添加&currentPage=1就可以訪問(wèn)不同頁(yè)碼的評(píng)論

#抓取98頁(yè)評(píng)論
for i in range(2, 98, 1):
   url = base_url + '&currentPage=%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ù)----------------------------------------------------------------------------------------------------------------------------

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 目錄: Python網(wǎng)絡(luò)爬蟲(一)- 入門基礎(chǔ)Python網(wǎng)絡(luò)爬蟲(二)- urllib爬蟲案例Python網(wǎng)絡(luò)爬...
    一只寫程序的猿閱讀 37,640評(píng)論 3 49
  • 網(wǎng)絡(luò)爬蟲的基本介紹 學(xué)習(xí)爬蟲,我想主要從以下幾個(gè)方面來(lái)切入 -爬蟲的原理? -爬蟲的作用? -爬蟲的實(shí)現(xiàn)? -爬蟲...
    狗子渣渣閱讀 1,201評(píng)論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,595評(píng)論 19 139
  • 1.10.21的平面
    Dhhftyhvd閱讀 212評(píng)論 0 0
  • 文/熠歆 自從大學(xué)畢業(yè)后,工作三年以來(lái),我覺(jué)得似乎我很平常,平常得我自認(rèn)為這種生活仿佛猶如過(guò)著安享晚年的錯(cuò)覺(jué)。 每...
    熠歆閱讀 598評(píng)論 4 1

友情鏈接更多精彩內(nèi)容