Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
X0
HTTP(HyperText Transfer Protocol)超文本傳輸協議,是web服務器到web瀏覽器之間傳輸的通信規則。
0x01
HTTP協議目前最新版本是1.1,HTTP是一種無狀態的協議,只能由客戶端發起,服務器端不能主動向客戶端發送數據。
應答模型:
Request請求
客戶端=============》服務端
《============
Response響應
0x02 HTTP請求
包括三個部分:1、請求行; 2、請求頭; 3、請求正文。
實例:
GET /notification/notification_count/ HTTP/1.1 請求行
Host: mp.xxxxxx.com 請求頭
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:52.0) Gecko/20100101 Firefox/52.0 (User-Agent代表瀏覽器標識。)
Accept: application/json, text/javascript, */*; q=0.01 正文
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://mp.toutiao.com/profile_v2/publish
X-Requested-With: XMLHttpRequest
圖例brupsuite:
使用python socket測試http響應的效果:
import socket
t_host="www.toutiao.com"
t_port=80
client=socket.socket()
client.connect((t_host,t_port))
client.send("GET / HTTP/1.1\r\nHost:toutiao.com\r\n\r\n")
response=client.recv(4096)
print response
HTTP/1.1 502 Bad Gateway //響應行 HTTP的版, 狀態碼 502,消息是Bad Gateway
Server: Tengine //響應頭 由服務器向客戶端發送
Content-Length: 0
Connection: keep-alive
Via: cache5.cn218[0,502-257,M], cache4.cn218[14,1,502001]
X-Swift-Error: dns domain not exist
Timing-Allow-Origin: *
EagleId: 790e0d0415057759521686693e
........由于response獲取的字節有限下面是響應正文,是服務器向客戶端發送的HTML數據。
EOF:下一遍我將講述HTTP的請求方法,請期待。
碼如下:
import requests from bs4 import BeautifulSoup import pandas as pd #下面是請求數據 url="https://www.163.com/" #設置請求網址為搜索網址 response=requests.get(url) #對163網站就行get請求并將請求結果賦值給response response.encoding="GBK" #設置編碼為GBK格式的 html=response.text #獲取網頁的html源代碼并賦值給html #下面是解析數據 soup=BeautifulSoup(html) content=soup.findAll('div') #查找所有的div標簽內容并賦值給content print(content) #打印content
代碼運行結果如下圖所示:
多朋友都聽說過Python的大名,而Python也擁有眾多的爬蟲框架,其中最簡單的莫過于requests-html了。它和著名的網絡請求庫requests是同一個作者,著重于XML數據提取,可以說是最簡單的爬蟲框架了。
安裝這個類庫非常簡單,直接通過pip就可以安裝了。
pip install requests-html
requests-html用起來也十分簡單,下面是一個簡單例子。照例說明一下,第一段引入了HTMLSession用于創建連接,獲取網頁數據。第二段創建連接,獲取了我的簡書用戶頁面。第三段用xpath語法獲取了網頁上的用戶名,最后打印出來。
from requests_html import HTMLSession
session=HTMLSession()
response=session.get(
'https://www.jianshu.com/u/7753478e1554')
username=response.html.xpath(
'//a[@class="name"]/text()', first=True)
print(username)
看起來是不是很簡單?沒錯,確實很簡單,接下來還有一些更加有趣的功能。
編寫爬蟲之前還要做一件事情,就是分析網頁的結構。這個工作其實也很簡單,打開你要訪問的網頁,按F12打開開發人員工具,可以看到最左邊有這么一個按鈕。點擊這個按鈕,然后點擊網頁上你想要查看的網頁元素,然后你就可以發現這個元素對應的相關源代碼已經為你定位完畢了。
定位按鈕
通過這個功能,我們就可以輕松的分析網頁,然后通過它的結構來編寫爬蟲了。
上面的response.html即是網頁的根節點HTML節點,在節點對象上可以調用一些方法來檢索數據。最常用的方法是find方法,它通過CSS選擇器來定位數據。對于上面的例子,可以用find方法改寫第三段。
因為所有查找方法返回的結果都是列表,所以如果你確定只需要查找一個,就將first參數設為真來只返回第一個結果。find方法返回的仍然是一個節點,如果只需要節點的內容,調用其text屬性即可。
用戶名對應的HTML結構如圖所示。
代碼如下。
username = response.html.find('a.name', first=True).text
除了find方法之外,還可以使用xpath方法用xpath語法來查找節點,正如第一個例子那樣。我個人比較喜歡xpath語法,CSS選擇器雖然更加流行一些,但是寫出來的效果有點怪,不如xpath工整。
同樣是這個頁面,看看如何獲取我的簡書的個人簡介。網頁代碼如圖所示。
代碼如下。
description=response.html.xpath(
'//div[@class="description"]/div[@class="js-intro"]/text()', first=True)
CSS選擇器和XPATH語法都不是本篇的主要內容,如果你這方面不太熟悉,最好去看一下相關的教程。當然如果大家有什么疑問的話,也可以提出來。假如大家想看的話,我也可以專門寫一篇文章介紹一下這些語法知識。
有些網頁利用了前后端分離技術開發的,需要瀏覽器渲染才能完整顯示。如果用爬蟲去看的話,只能顯示一部分內容。這時候就需要瀏覽器渲染頁面,才能獲取完整的頁面。用requests-html的話,這個過程非常簡單。
首先先來看看一個需要渲染網頁的例子。下面的代碼訪問了我的簡書用戶頁面,然后嘗試獲取我的所有文章。但是如果你運行這個例子的話,就會發現只能獲取前幾項。因為簡書的頁面正是一個典型的需要瀏覽器渲染的頁面,爬蟲獲取到的網頁是不完整的。
from requests_html import HTMLSession
session=HTMLSession()
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.119 Safari/537.36'
}
url='https://www.jianshu.com/u/7753478e1554'
r=session.get(url, headers=headers)
for a in r.html.xpath('//ul[@class="note-list"]/li/div[@class="content"]/a[@class="title"]'):
title=a.text
link=f'https://www.jianshu.com{a.attrs["href"]}'
print(f'《{title}》,{link}')
那么如何渲染網頁來獲取完整的結果呢?其實非常簡單,在查詢HTML節點之前,調用render函數即可。
render函數來使用瀏覽器渲染
原理也非常簡單,第一次調用render的時候,requests-html會在本地下載一個chromium瀏覽器,用它來渲染網頁。如此一來,我們就可以獲取到渲染之后的頁面了。
但是對于簡書這個例子來說還是有些問題,因為如果你在瀏覽器里打開這個網頁的話,會發現一些文章在瀏覽器下滑頁面的時候才開始渲染。不過聰慧的作者早就考慮到這種情況了,render函數支持下滑的參數,設定之后,就會模擬瀏覽器下滑操作,從而解決了這個問題。
r.html.render(scrolldown=50, sleep=0.2)
不論上面的r.html還是find/xpath函數返回的結果,它們都是節點對象。除了上面介紹的幾個提取數據的方法以外,節點對象還有以下一些屬性,在我們提取數據的時候也有很大作用。
相較于專業的爬蟲框架scrapy,或者僅用于解析XML的解析庫BeautifulSoup。requests-html可以是說恰到好處,它沒有前者那么難學,也不像后者還需要搭配HTTP請求庫才能使用。如果你手頭需要臨時抓取幾個網頁,那么requests-html就是你最好的選擇。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。