之前說了触趴,我們直接抓取出來的網(wǎng)頁(yè)是靜態(tài)的力奋,并不能獲取到動(dòng)態(tài)內(nèi)容终畅,可以通過selenium
來實(shí)現(xiàn)動(dòng)態(tài)內(nèi)容獲取籍胯。
概念解釋
Selenium 是一個(gè)測(cè)試工具,測(cè)試直接在瀏覽器中運(yùn)行离福,就像真實(shí)用戶所做的一樣杖狼,所以可以模擬瀏覽器訪問頁(yè)面下載js內(nèi)容和ajax內(nèi)容,支持很多瀏覽器:
- Google Chrome
- Internet Explorer 7, 8, 9, 10, 11
- Firefox
- Safari
- Opera
- HtmlUnit
- PhantomJS
- Android
- iOS
PhantomJS是一個(gè)沒有界面的瀏覽器术徊,為什么使用這個(gè)呢本刽,因?yàn)檫@樣不用再打開一個(gè)瀏覽器了,是在背后運(yùn)行赠涮,其實(shí)速度和其他瀏覽器是差不多的子寓,某些情況下還不如其他瀏覽器速度快。
安裝
Selenium官網(wǎng)笋除。
pip install selenium
至于webdriver下載斜友,對(duì)應(yīng)的瀏覽器有不一樣的下載地方,這個(gè)自己去找垃它,提供一個(gè)Chrome Driver的下載地址:Chrome Driver
使用
self.driver = webdriver.PhantomJS()
self.driver.get(response.url)
selector = Selector(text=self.driver.page_source)
webdriver可以設(shè)置成多種鲜屏,例如Chrome:
webdriver.Chrome("/Users/Carlton/chromedriver") # 構(gòu)造參數(shù)是下載的ChromeDriver路徑
這樣我們就通過瀏覽器(PhantomJS可以理解成沒有界面的瀏覽器)來下載了烹看,下載完成的網(wǎng)頁(yè)源代碼通過driver.page_source
獲取。
提一下這個(gè)Selector
洛史,拿到源代碼后需要分析網(wǎng)頁(yè)的內(nèi)容惯殊,通過Selector
就很簡(jiǎn)單,推薦使用Selector
而不是driver提供的xpath工具也殖,因?yàn)楹芏鄷r(shí)候driver提供的工具并不能按照預(yù)期運(yùn)行土思。
項(xiàng)目實(shí)例
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忆嗜,等下用這個(gè)來下載動(dòng)態(tài)地址己儒,還初始化了start_urls
這個(gè)地址是用瀏覽器訪問淘寶搜索拷貝出來的,這里我們搜索硬盤捆毫。需要注意的是parse必須返回Item或者Request闪湾,self.driver.get(response.url)
抓取數(shù)據(jù)后,通過self.driver.page_source
來獲取動(dòng)態(tài)的內(nèi)容绩卤。這樣爬蟲開始后就會(huì)啟動(dòng)chrome瀏覽器途样,然后開始下載淘寶數(shù)據(jù)。
總結(jié)
這一篇寫了省艳,Selenium 和 PhantomJS等結(jié)合起來抓取動(dòng)態(tài)數(shù)據(jù)娘纷。selenium是一個(gè)前端自動(dòng)化測(cè)試工具,可以通過它來連接很多瀏覽器跋炕,通過webdriver連接的瀏覽器赖晶,然后把瀏覽器訪問下載的內(nèi)容通過selenium返回給Scrapy。
上一篇:Scrapy爬蟲框架:安裝和開始新項(xiàng)目
下一篇:Scrapy爬蟲框架:抓取淘寶天貓數(shù)據(jù)
不登高山辐烂,不知天之高也遏插;不臨深溪,不知地之厚也
感謝指點(diǎn)纠修、交流胳嘲、喜歡