以京東為例簡單的寫下抓取動態資料

2021-07-15 21:08:17 字數 2944 閱讀 7636

不管是使用beautifulsoup還是scrapy的過程中,都會發現明明網頁的源**裡有的資料,但是就是抓取不出來,原因呢就是因為這個資料是由js生成的動態資料。

要抓取這個動態資料一般來說是有2種方法。一種是直接找到js的資料來源,那樣就會得到乙個xml或者是json的資料,後續處理一下就可以了。另外一種就是瀏覽器直接執行完js,然後再去抓取得到的資料。

比較下2種方法的優缺點。速度上:第一種就是快,相當於直接去獲取到了資料。而第2種因為要等整個瀏覽器執行完js之後再去獲取,速度簡直是天差地別。便利性:第一種就不夠方便了,首先需要花費精力在開發者工具中查詢資料來源,這本身可能就比較麻煩。大規模爬取的時候資料來源沒有規律,不能從同乙個資料來源讀取資料,所以大規模爬取的時候就希望一種通用的方法。這時候就是第2種上場的時候了。不需要尋找什麼,只要將執行完js之後的資料爬取出來就ok了,通用性強。

我們以scrapy作為框架,來看看京東的資料抓取。

from scrapy_redis.spiders import redisspider

from jdspider.items import jdspiderloader

from splinter import browser

from scrapy import log

class

myspider

(redisspider):

'''spider that reads urls from redis queue (myspider:start_urls).'''

name = 'jdspider'

redis_key = 'jdspider_urls'

def__init__

(self, *args, **kwargs):

domain = kwargs.pop('domain', '')

self.allowed_domans = filter(none, domain.split(','))

super(myspider, self).__init__(*args, **kwargs)

defparse

(self, response):

el = jdspiderloader(response=response)

el.add_xpath('title', '//*[@id="name"]/h1/text()')

with browser() as browser:

url = response.url

browser.visit(url)

price = browser.find_by_id('jd-price')

if price == :

price = browser.find_by_xpath('//*[@id="price"]/strong')

# self.log(price[0].value, level=log.debug)

el.add_value('price', price[0].value[1:])

with browser() as browser:

number = response.url.split('/')[-1].split('.')[0]

url = '' + number + '-2-1.html'

browser.visit(url)

shaitu = browser.find_by_xpath('//*[@id="comments-list"]/div[1]/ul/li[5]/a/em')

el.add_value('shaitu', shaitu[0].value[1:-1])

haoping = browser.find_by_xpath('//*[@id="comments-list"]/div[1]/ul/li[2]/a/em')

el.add_value('haoping', haoping[0].value[1:-1])

zhongping = browser.find_by_xpath('//*[@id="comments-list"]/div[1]/ul/li[3]/a/em')

el.add_value('zhongping', zhongping[0].value[1:-1])

chaping = browser.find_by_xpath('//*[@id="comments-list"]/div[1]/ul/li[4]/a/em')

el.add_value('chaping', chaping[0].value[1:-1])

return el.load_item()

我們這裡用到的庫是splinter。具體的我就不介紹了,它會呼叫firefox來載入完介面,完成解析。所以如果需要使用這個庫的話,需要安裝firefox。

下面看具體的**。**其實很簡單。

with browser() as browser:

url = response.url

browser.visit(url)

price = browser.find_by_id('jd-price')

if price == :

price = browser.find_by_xpath('//*[@id="price"]/strong')

# self.log(price[0].value, level=log.debug)

el.add_value('price', price[0].value[1:])

從splinter裡import進來browser,看名字就知道是瀏覽器,然後with的上下文管理器裡面的內容就是乙個簡單的抓取**。既可以用browser.find_by_id()來獲取資料,也可以用browser.find_by_xpath()來獲取資料。(之所以有2個,是因為京東的價錢有2種格式的,第一種獲取不到的話就使用第2種。)用起來非常簡單。

splinter的手冊:

以上**可以從獲得,當然了,這只是一部分,其他的還未完成。

以京東為例簡單無延遲選單實現(二)

demo1記一筆 一般css定位只需寫left與top兩個屬性,因為當乙個塊級未能填充滿整個頁面時,加入定位的left與right屬性會以left為準,top與bottom同理 ulli這裡涉及兩個屬性 height,line height。簡單來說,line height是行高的意思,height...

偽靜態說明,如何使用偽靜態 以京東為例

問題 1.京東的頁面為什麼採用.html 答案 採用html靜態的方式原因2 1.靜態頁面瀏覽器載入的速度更快.2.以.html結尾的頁面,更加的容易被搜尋引擎收錄.可以提高 的 率.問題2 為什麼搜尋引擎只收錄靜態頁面,而不是動態頁面?搜尋引擎的工作原理 倒排索引 倒排索引 根據關鍵字檢索文章的位...

遞迴 動規問題中的邊界條件 以滑雪為例

描述 michael喜歡滑雪這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道載乙個區域中最長的滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 5 16 1...