爬蟲專案實戰(一)

米兒~發表於2020-06-15

大綱:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

一、爬蟲介紹

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
二、網路請求requests
在這裡插入圖片描述
1、requests庫的基本使用
在這裡插入圖片描述
2、GET&POST
在這裡插入圖片描述
在這裡插入圖片描述
檢視電腦當前的python版本在cmd
中輸入命令:python -V
在這裡插入圖片描述
如果電腦中有兩個python環境,例如想在python3中下載時,使用命令:pip3 install requests 即可

接下來以爬取古詩文網為例https://www.gushiwen.org/
在這裡插入圖片描述
在這裡插入圖片描述
開啟古詩文網址,按F12,檢視原始碼
在這裡插入圖片描述
在這裡插入圖片描述
而之前程式碼中顯示是由python程式碼的爬蟲程式訪問的。
注:python的第三方庫均可在https://pypi.org中下載
在這裡插入圖片描述
小插曲(一)—解決bug
摘錄自https://blog.csdn.net/greatpresident/article/details/8209712?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
此時,程式報錯,UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa9’ in position 57096: illegal multibyte sequence(UnicodeEncodeError: ‘gbk’編解碼器不能在57096位置編碼字元’\xa9’:非法多位元組序列)大致是編碼出了問題
使用Python寫檔案的時候,或者將網路資料流寫入到本地檔案的時候,大部分情況下會遇到:UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa0’ in position … 這個問題。 網路上有很多類似的檔案講述如何解決這個問題,但是無非就是encode,decode相關的,這是導致該問題出現的真正原因嗎?不是的。 很多時候,我們使用了decode和encode,試遍了各種編碼,utf8,utf-8,gbk,gb2312等等,該有的編碼都試遍了,可是編譯的時候仍然出現: UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa0’ in position XXX。 崩潰了。
在windows下面編寫python指令碼,編碼問題很嚴重。
將網路資料流寫入檔案時時,我們會遇到幾個編碼:
1: #encoding=‘XXX’ 這裡(也就是python檔案第一行的內容)的編碼是指該python指令碼檔案本身的編碼,無關緊要。只要XXX和檔案本身的編碼相同就行了。 比如notepad++ "格式"選單裡面裡可以設定各種編碼,這時需要保證該選單裡設定的編碼和encoding XXX相同就行了,不同的話會報錯
2:網路資料流的編碼 比如獲取網頁,那麼網路資料流的編碼就是網頁的編碼。需要使用decode解碼成unicode編碼。
3:目標檔案的編碼 要將網路資料流的編碼寫入到新檔案,那麼我麼需要指定新檔案的編碼。寫檔案程式碼如:
f.write(txt)
那麼txt是一個字串,它是通過decode解碼過的字串。關鍵點就要來了:目標檔案的編碼是導致標題所指問題的罪魁禍首。如果我們開啟一個檔案:
f = open(“out.html”,“w”)
在windows下面,新檔案的預設編碼是gbk,這樣的話,python直譯器會用gbk編碼去解析我們的網路資料流txt,然而txt此時已經是decode過的unicode編碼,這樣的話就會導致解析不了,出現上述問題。 解決的辦法就是,改變目標檔案的編碼:
f = open(“out.html”,“w”,encoding=‘utf-8’)
問題解決
在這裡插入圖片描述
定義請求頭:
在這裡插入圖片描述
因為網站檢測到是爬蟲程式訪問,直接拒絕
在這裡插入圖片描述
在這裡插入圖片描述
小插曲(二)–其他偽裝瀏覽器的User-Agent寫法(前五種就夠用了)
摘錄自https://www.cnblogs.com/zrmw/p/9332801.html

  1. Chrome
    Win7:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1

  2. Firefox
    Win7:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0

  3. Safari
    Win7:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50

  4. Opera
    Win7:Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50

  5. IE
    Win7+ie9:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)

Win7+ie8:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)

WinXP+ie8:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)

WinXP+ie7:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)

WinXP+ie6:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)

  1. 傲遊
    傲遊3.1.7在Win7+ie9,高速模式:
    Mozilla/5.0 (Windows; U; Windows NT 6.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12

傲遊3.1.7在Win7+ie9,IE核心相容模式:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)

  1. 搜狗
    搜狗3.0在Win7+ie9,IE核心相容模式:
    Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)

搜狗3.0在Win7+ie9,高速模式:
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.33 Safari/534.3 SE 2.X MetaSr 1.0

  1. 360
    360瀏覽器3.0在Win7+ie9:
    Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)

  2. QQ瀏覽器
    QQ瀏覽器6.9(11079)在Win7+ie9,極速模式:
    Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 QQBrowser/6.9.11079.201

QQ瀏覽器6.9(11079)在Win7+ie9,IE核心相容模式:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E) QQBrowser/6.9.11079.201

  1. 阿雲瀏覽器
    阿雲瀏覽器1.3.0.1724 Beta(編譯日期2011-12-05)在Win7+ie9:
    Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)

post請求方式:
在這裡插入圖片描述
ajax可以做到不重新整理不載入 直接傳送訊息,是前端的一門技術。

import requests
#定義請求的url
url = 'https://fanyi.baidu.com/sug'
#定義請求頭資訊
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
}
#post傳送的資料
# data_v = input("please enter the word:")
data = {'kw':'你好'}
#傳送請求
res = requests.post(url=url,headers=headers,data=data)
#接受返回的資料
# print(res.status_code)
# print(res.json())
code = res.status_code
if code == 200:
    print('請求成功')
    data = res.json()
    if data['errno'] == 0:
        print('響應成功')
        k = data['data'][0]['k']
        v = data['data'][0]['v'].split(';')[-2]
        print(k,'====',v)

4、requests處理cookie資訊
什麼是cookie?有什麼作用?
http請求是無狀態的請求協議,不會記住使用者的狀態和資訊,也不清楚使用者在這之前訪問過什麼,因為網站需要記錄使用者是否登陸時,就需要在使用者登入後,就需要把使用者的資訊記錄在當前使用者的瀏覽器中,記錄的內容就是cookie,使用者使用當前的瀏覽器繼續訪問這個伺服器時,會主動攜帶這個網站設定的cookie資訊來確認使用者的資訊。
cookie會在瀏覽器中記錄資訊,並在訪問時攜帶此資訊
1)瀏覽器更換或刪除cookie後,資訊被刪除
2)cookie在瀏覽器中記錄的資訊是不安全的,因為不能夠記錄敏感資訊
session:
是在伺服器端給每個使用者設定一個sessionID,並且把這個sessionID設定在使用者的瀏覽器中,也就是設定為cookie
在這裡插入圖片描述
在這裡插入圖片描述
在寫入的檔案中尋找之前使用者的訂單號
注:在pycharm總ctrl+F進行搜尋
在這裡插入圖片描述
顯示搜尋失敗,再搜尋login發現此時為登陸介面
在這裡插入圖片描述
原因是因為此時的python爬蟲程式沒有攜帶cookie資訊,沒有使用者資訊,因此無法登陸,
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
以上均為手動複製貼上過程,以下嘗試程式自動抓取資訊
使用requests中的session方法,最終請求的目標地址:http://www.rrys2019.com/user/user
在這裡插入圖片描述
登陸要請求的url :http://www.rrys2019.com/user/user
登陸要用的資料:
account: mier~
password: MIer112233…
remember: 1
url_back: http://www.rrys2019.com/user/user
在這裡插入圖片描述

import requests
#需要請求的目標地址
url = "http://www.rrys2019.com/user/user"
#登陸請求的地址
loginurl = "http://www.rrys2019.com/User/Login/ajaxLogin"
#定義請求頭資訊
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
}
#如果需要爬蟲程式主動記錄cookie並且攜帶cookie,那麼在使用requests之前session
#並且使用session方法返回的物件傳送請求即可
req = requests.session()
#登陸請求時的資料
data = {
    "account":"mier~",
    "password":"MIer112233..",
    "remember":"1",
    "url_back":"http://www.rrys2019.com/"
}
res = req.post(url=loginurl,headers=headers,data=data)
#判斷狀態
code = res.status_code
print(code)
if code == 200:
    #發起新的請求,去獲取目標資料
    res = req.get(url=url,headers=headers)
    with open('rr.html','w',encoding='utf-8') as fp:
        fp.write(res.text)

已經獲取到登陸需要的資料,如下:
在這裡插入圖片描述

相關文章