之前說了,我們直接抓取出來的網頁是靜態的,并不能獲取到動態內容,可以通過selenium
來實現動態內容獲取。
概念解釋
Selenium 是一個測試工具,測試直接在瀏覽器中運行,就像真實用戶所做的一樣,所以可以模擬瀏覽器訪問頁面下載js內容和ajax內容,支持很多瀏覽器:
- Google Chrome
- Internet Explorer 7, 8, 9, 10, 11
- Firefox
- Safari
- Opera
- HtmlUnit
- PhantomJS
- Android
- iOS
PhantomJS是一個沒有界面的瀏覽器,為什么使用這個呢,因為這樣不用再打開一個瀏覽器了,是在背后運行,其實速度和其他瀏覽器是差不多的,某些情況下還不如其他瀏覽器速度快。
安裝
Selenium官網。
pip install selenium
至于webdriver下載,對應的瀏覽器有不一樣的下載地方,這個自己去找,提供一個Chrome Driver的下載地址:Chrome Driver
使用
self.driver = webdriver.PhantomJS()
self.driver.get(response.url)
selector = Selector(text=self.driver.page_source)
webdriver可以設置成多種,例如Chrome:
webdriver.Chrome("/Users/Carlton/chromedriver") # 構造參數是下載的ChromeDriver路徑
這樣我們就通過瀏覽器(PhantomJS可以理解成沒有界面的瀏覽器)來下載了,下載完成的網頁源代碼通過driver.page_source
獲取。
提一下這個Selector
,拿到源代碼后需要分析網頁的內容,通過Selector
就很簡單,推薦使用Selector
而不是driver提供的xpath工具,因為很多時候driver提供的工具并不能按照預期運行。
項目實例
import json
from scrapy import Request
from scrapy import Selector
from scrapy.crawler import CrawlerProcess
from scrapy.spiders import Spider
from scrapy.utils.project import get_project_settings
from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver
class TmallAndTaoBaoSpider(Spider):
name = "tts"
allowed_domains = ['tmall.com', 'taobao.com']
start_urls = []
total_items = 0
def __init__(self, *args, **kwargs):
super(TmallAndTaoBaoSpider, self).__init__(*args, **kwargs)
self.count = 0
self.error_count = 0
if keys is None or dt is None:
return
self.driver = webdriver.Chrome("/Users/Carlton/chromedriver")
url = "https://s.taobao.com/search?q=硬盤&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.50862.201856-taobao-item.1&ie=utf8&style=list"
self.start_urls.append(url)
def __del__(self):
if self.driver is not None:
self.driver.quit()
def parse(self, response):
return self._parse_handler(response)
def _parse_handler(self, response):
self.driver.get(response.url)
selector = Selector(text=self.driver.page_source)
pass
解釋一下,__init__
初始化了webdriver,等下用這個來下載動態地址,還初始化了start_urls
這個地址是用瀏覽器訪問淘寶搜索拷貝出來的,這里我們搜索硬盤。需要注意的是parse必須返回Item或者Request,self.driver.get(response.url)
抓取數據后,通過self.driver.page_source
來獲取動態的內容。這樣爬蟲開始后就會啟動chrome瀏覽器,然后開始下載淘寶數據。
總結
這一篇寫了,Selenium 和 PhantomJS等結合起來抓取動態數據。selenium是一個前端自動化測試工具,可以通過它來連接很多瀏覽器,通過webdriver連接的瀏覽器,然后把瀏覽器訪問下載的內容通過selenium返回給Scrapy。
不登高山,不知天之高也;不臨深溪,不知地之厚也
感謝指點、交流、喜歡