1. 程式人生 > >python動態爬取網頁

python動態爬取網頁

匹配 應用 https select idt beautiful 檢查 選擇 path

簡介

有時候,我們天真無邪的使用urllib庫或Scrapy下載HTML網頁時會發現,我們要提取的網頁元素並不在我們下載到的HTML之中,盡管它們在瀏覽器裏看起來唾手可得。

這說明我們想要的元素是在我們的某些操作下通過js事件動態生成的。舉個例子,我們在刷QQ空間或者微博評論的時候,一直往下刷,網頁越來越長,內容越來越多,就是這個讓人又愛又恨的動態加載。

爬取動態頁面目前來說有兩種方法

  1. 分析頁面請求
  2. selenium模擬瀏覽器行為

1.分析頁面請求

鍵盤F12打開開發者工具,選擇Network選項卡,選擇JS(除JS選項卡還有可能在XHR選項卡中,當然也可以通過其它抓包工具),如下圖

技術分享圖片

然後,我們來拖動右側的滾動條,這時就會發現,開發者工具裏出現了新的js請求(還挺多的),不過草草翻譯一下,很容易就能看出來哪個是取評論的,如下圖

技術分享圖片

好,復制出js請求的目標url

技術分享圖片

在瀏覽器中打開,發現我們想要的數據就在這裏,如下圖

技術分享圖片

這整個頁面是一個json格式的數據,對於京東來說,當用戶下拉頁面時,觸發一個js事件,向服務器發送上面的請求取數據,然後通過一定的js邏輯把取到的這些json數據填充到HTML頁面當中。對於我們Spider來說,我們要做的就是把這些json數據整理提取。

在實際應用中,當然我們不可能去每個頁面裏找出來這個js發起的請求目標地址,所以我們需要分析這個請求地址的規律,一般情況下規律是比較好找的,因為規律太復雜服務方維護也難。

2.selenium模擬瀏覽器行為

對於動態加載,能看到Selenium+Phantomjs

的強大。打開網頁查看網頁源碼(註意不是檢查元素)會發現要爬取的信息並不在源碼裏面。也就是說,從網頁源碼無法通過解析得到數據。Selenium+Phantomjs的強大一方面就在於能將完整的源碼抓取到

例子:在豆瓣電影上根據給出的名字搜索對應的信息

#-*- coding:utf-8 -*-
import sys
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup

reload(sys)
sys.setdefaultencoding(
utf-8) url = https://movie.douban.com/ #這個路徑就是你添加到PATH的路徑 driver = webdriver.PhantomJS(executable_path=C:/Python27/Scripts/phantomjs-2.1.1-windows/bin/phantomjs.exe) driver.get(url) #在搜索框上模擬輸入信息並點擊 elem = driver.find_element_by_name("search_text") elem.send_keys("crazy") elem.send_keys(Keys.RETURN) #得到動態加載的網頁 data = driver.page_source soup = BeautifulSoup(data, "lxml") # 進行匹配 for i in soup.select("div[class=‘item-root‘]"): name = i.find("a", class_="title-text").text pic = i.find("img").get(src) url = i.find("a").get(href) rate = "" num = "" if i.find("span", class_="rating_nums") is None: print name.encode("gbk", "ignore"), pic, url else: rate = i.find("span", class_="rating_nums").text num = i.find("span", class_="pl").text print name.encode("gbk", "ignore"),pic,url,rate.encode("gbk", "ignore"),num.encode("gbk", "ignore")

python動態爬取網頁