有時候我們在利用requests抓取網頁時,得到的結果可能與在瀏覽器中看到的結果不一樣:在瀏覽器中能看到的東西,但是在爬取下來的網頁源**中看不到。這是因為requests獲取的都是最原始的html文件,而瀏覽器中的頁面則是經過js處理資料得到的結果,這些資料的**有很多種,第一種方式是:通過ajax,第二種方式:在html文件中,第三種方式:經過js和特定的演算法實現的。對於第一種情況,原始的介面不會包含某些資料,等原始介面載入完畢後,會在向伺服器請求資料,然後將請求的資料經過js渲染得到介面在顯示給使用者。
那麼重點來了!!!什麼是ajax???------ajax簡介
一張圖來看ajax在瀏覽器與伺服器之間所起的作用:
在知道什麼是ajax之後,那麼我們如何利用ajax來獲取資料呢?
首先在瀏覽器中找到ajax請求:以微博為例:
找到我們所要的一些資料,就可以利用requests來模擬ajax請求了具體的**如下
import requests
import json
def gethtml(url):
try:
headers =
params =
response = requests.get(url,headers = headers,params=params)
response.raise_for_status()
return response.text
except: "爬取失敗"
if __name__ == '__main__':
url = ""
page = gethtml(url)
print(page)
說明:
對於params部分引數的說明:
page:控制頁碼
__rnd:據我推測是個隨機數,具體指什麼請大神賜教
其他的引數:這些引數不變,小生愚鈍,也不知道幹嘛
然後再利用json庫的loads方法變成字典型別,這樣便於後續的操作。
if __name__ == '__main__':
url = ""
page = gethtml(url)
d = json.loads(page)
print(d.get("data"))
html = etree.html(d.get("data"))
imgs = html.xpath("//h3[@class = 'list_title_s']/div/text()")
for i in imgs:
print(i.strip())
上面**中的d就是乙個字典,可以取出其中的資料,資料就是下面紅色方框內的資訊
接下來的那幾行**,我大膽採用lxml庫來進行解析,我不知道可不可以用,但我知道利用正規表示式一定可以。
結果我居然成功的提取出來了
我這是第一次利用模擬ajax來爬取**,有錯誤的地方請批評指正!
有興趣的小夥伴可以一起交流哦!
python利用Ajax分析方法爬取豆瓣劇情片排行
需要的庫 requests urllib.parse下的urlencode json csvtime 通過檢視network中的ajax請求的xhr檔案發現這條ajax請求包含的資訊如下 可以看到,包含了前20條電影的所有資訊 當再次向下滑動時,會出現新的xhr檔案 每個新的xhr檔案內包含了20條...
爬取新浪微博
學到的東西。1 習慣用logger,而不是用print self.logger.debug 開始解析 format response.url 2 習慣用正規表示式 這是在pipeline清理資料時用到的 s 5分鐘前 if re.match d 分鐘前 s minute re.match d s g...
Day1 Ajax資料爬取
一 渲染網頁 document.getelementbyid mydiv innerhtml xmlhttp.responsetext 這裡就是將id是mydiv的節點內部的html 更改為伺服器返回的內容了 6.2 ajax分析方法 1 在微博的頁面中,開啟審查元素中network,重新整理一下頁...