日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

爬虫 404 try_和我一起学爬虫

發布時間:2023/12/4 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬虫 404 try_和我一起学爬虫 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前幾天就想寫一個爬蟲系列的文章,因為比較忙所以沒有寫(還不是因為懶),趁著現在屋里比較的涼爽,心也比較的靜,總結下目前遇到的一些爬蟲知識,本系列將從簡單的爬蟲開始說起,以后會逐漸的提升難度,同時會對反爬手段做一個總結,以及用具體的事例來演示,不同的反爬現象和實現手段。

前言

本系列側重點是應用和實戰,所以,對于軟件的安裝這些基本操作不做詳細講解,我這里認為你已經有了一定的python基礎,所以對于python的安裝一定會有一定的了解了,這里廢話不多說讓我們進入正題。

環境準備

鑒于大多數人的系統是windows系統,所以這里的所有內容都是在Windows下進行的,另外推薦安裝谷歌瀏覽器,使用語言python,版本3.6(低版本不能使用requests_html)。主要的爬蟲模塊requests_html。

爬蟲具備的基本條件

作為一個合格的爬蟲,首先得有一個headers,如何理解headers,我們打開谷歌瀏覽器,然后F12,選擇network選項卡,打開百度的首頁,然后打開然后選擇其中的一個鏈接,然后點擊新彈出的窗口的headers,看到有一個'Request Headers',我們看到下面紅框的內容,這些由:組成的數據結構,共同構成了一個headers,在python中可以把這些字段作為一個字典傳入。

爬蟲的代碼實現

下面我來看一個基本爬蟲代碼,爬取百度的導航欄文字內容。
1.導入requests_html模塊。

from requests_html import HTMLSession

2.創建一個session對象,目的是維持一次完整的會話。

session=HTMLSession()

3.通過get方法訪問網絡

url='https://www.baidu.com' headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'} req=session.get(url=url,headers=headers)

get方法需要傳入兩個參數,一個是url,一個是headers(字典類型)。一般的我們傳入一個user_agent就可以愉快的使用了。(這里只是說一般的對于有先網站服務器還會監測headers的其他屬性內容)。我們會獲取一個response對象。

拓展:如果查看requests_html的源碼會發現默認是給了幾個headers屬性的。

def default_headers():""":rtype: requests.structures.CaseInsensitiveDict"""return CaseInsensitiveDict({'User-Agent': default_user_agent(), #這個就是一個隨機的useragent'Accept-Encoding': ', '.join(('gzip', 'deflate')),#接收編碼類型'Accept': '*/*',#接收文件類型'Connection': 'keep-alive',#保持鏈接})

4.獲取網頁返回的狀態碼
一般的我們把200狀態碼認為是響應成功(并不一定是你想要的結果,比如登陸失敗有些也是200)。
其他常見的還有,404網頁訪問失敗,500服務器拒絕訪問,302和301作為網頁的重定向。

if req.status_code==200:print("ok")

5.獲取正確的網頁編碼
因為每個頁面的編碼不同,可能導致在解析的時候出現亂碼的情況,對此requests_html模塊為我們提供了一個可以高準確率獲取編碼的方法,目前來看對于絕大對數html頁面是沒有問題的,所以可以放心使用。

req.encoding=req.apparent_encoding

6.查看獲取html源碼
此時我們已經獲取了編碼之后的對象了,如果我們需要查看獲取的內容以及編碼是否正確我們可以使用text屬性來獲取網頁的源碼,它是一個字符串格式的。
7.xpath表達式的使用
requets_html模塊的一個好處就是集合了眾多的網頁解析模塊比如,bs4,pyquery,lxml等,可以說相當的強大了,requests_html通過response的html屬性調用xpath方法,來直接操作dom對象,通過觀察我們獲取百度導航欄的標題的xpath,代碼我們可以這樣寫。

node_list=req.html.xpath("//div[@id='u1']/a/text()")

簡單說下上面xpath表達式的含義,//從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。/表示從根節點選取。后面跟的ediv表示是div節點,中括號里面一般是做屬性判斷@id就是判斷id屬性然后取其值為ul的,后面緊跟的/a,表示上面div節點的下級所有含有a的節點,然后后面的text()是表示獲取該節點的文本信息。
8綜合整理下上面的代碼如下:

from requests_html import HTMLSession from traceback import format_exc class BaiDu():def __init__(self):self.session=HTMLSession()self.url='https://www.baidu.com'self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'}self.timeout=20def gethtml(self):try:req=self.session.get(url=self.url,headers=self.headers,timeout=self.timeout)if req.status_code==200:req.encoding=req.apparent_encodingtitle_info=self.parse_html(req)return ' | '.join(title_info)except:print("出錯了錯誤內容是",format_exc)def parse_html(self,req):node_list=req.html.xpath("//div[@id='u1']/a/text()")return node_list if __name__ == '__main__':baidu=BaiDu()title=baidu.gethtml()print(title)

輸出結果:

新聞 | hao123 | 地圖 | 視頻 | 貼吧 | 學術 | 登錄 | 設置 | 更多產品

好了,今天的內容就到這,內容比較的簡單,簡單的說了下爬蟲的基本思路,后面會一步步加大難度,如有任何問題和疑問歡迎留言。

關注微信公眾號:python學習開發 ,學習更多python知識

總結

以上是生活随笔為你收集整理的爬虫 404 try_和我一起学爬虫的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。