Scrapy爬蟲框架:Selenium + PhantomJS

之前說了,我們直接抓取出來的網頁是靜態的,并不能獲取到動態內容,可以通過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或者Requestself.driver.get(response.url)抓取數據后,通過self.driver.page_source來獲取動態的內容。這樣爬蟲開始后就會啟動chrome瀏覽器,然后開始下載淘寶數據。

總結

這一篇寫了,Selenium 和 PhantomJS等結合起來抓取動態數據。selenium是一個前端自動化測試工具,可以通過它來連接很多瀏覽器,通過webdriver連接的瀏覽器,然后把瀏覽器訪問下載的內容通過selenium返回給Scrapy。

上一篇:Scrapy爬蟲框架:安裝和開始新項目
下一篇:Scrapy爬蟲框架:抓取淘寶天貓數據

??查看更多??

不登高山,不知天之高也;不臨深溪,不知地之厚也
感謝指點、交流、喜歡

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容