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

python scrapy爬取動態頁面

preface:最近學習工作之外,有個朋友需要爬取動態網頁的要求,輸入關鍵詞爬取某個專利網站在該關鍵詞下的一些專利說明。以往直接python urllib2可破,但是那只是對於靜態網頁可破,但是對於用js等其他的生成的動態網頁的話,則貌似不行(沒試過)。然後在網上找了些資料,發現scrapy結合selenium包好像可以。(之所以這麼說,暫時滷主也還沒實現,先記錄下來。)

#=====================根據官網中簡單的介紹作個人理解========================

首先,安裝scrapy,selenium兩個包:

滷主在ubuntu下,並且已經安裝好了anaconda和pip以及easy_intasll,所以直接用pip安裝一步到位(或者easy_install):

pip install -U selenium
pip install Scrapy
easy_install  -U selenium
easy_install  Scrapy

其次,需要用scrapy新建專案,在終端執行如下命令新建專案:

scrapy startproject tutorial
則自動生成如下形式的資料夾:

Figure 1:新建專案後的資料夾

再次,開始編寫專案:

在items.py檔案中需要定義一些變數:

import scrapy

class DmozItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()

在資料夾tutorial/spiders下新建dmoz_spider.py檔案:
import scrapy

class DmozSpider(scrapy.Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]

    def parse(self, response):
        filename = response.url.split("/")[-2]
        with open(filename, 'wb') as f:
            f.write(response.body)
在該檔案中需要定義三個變數,其一為name,start_urls,parse這三個變數。

最後,在最外層資料夾下終端執行:

scrapy crawl dmoz

dmoz為資料夾tutorial/spiders下新建的檔案中DmozSpider類中重要的變數之一name的值。

便能開始爬取。

#=============================================

博友:http://chenqx.github.io/2014/12/23/Spider-Advanced-for-Dynamic-Website-Crawling/

介紹了抓取動態網站的一些內容,並且在github上共享了完整的專案程式碼。(先下載程式碼,對著程式碼看文件)

其gouwu.sogou.com任務為動態抓取頁面資訊。

滷主針對自己的任務,更改其gouwu.sogou.com/etao/lstData.py檔案,裡面lstData類lst列表變數裡面為搜尋的關鍵詞,傳入到spider.py檔案,組成url,開始爬取。

分析博友的程式碼沒找到爬取下來的動態頁面資訊存在哪裡的程式碼,

在spider.py檔案中加入自己的程式碼:

    def parse(self, response):
        #crawl all display page
        for link in self.link_extractor['page_down'].extract_links(response):
            yield Request(url = link.url, callback=self.parse)

        #browser
        self.browser.get(response.url)
        time.sleep(5)
        # get the data and write it to scrapy items
        etaoItem_loader = ItemLoader(item=EtaoItem(), response = response)
        url = str(response.url)
        etaoItem_loader.add_value('url', url)
        etaoItem_loader.add_xpath('title', self._x_query['title'])
        etaoItem_loader.add_xpath('name', self._x_query['name'])
        etaoItem_loader.add_xpath('price', self._x_query['price'])
        #====================================
#        for link in self.link_extractor['page_down'].extract_links(response):
#            yield Request(url = link.url, callback = self.parse_detail)
        for sel in response.xpath('//ul/li'):
            title = sel.xpath('a/text()').extract()
            link2 = sel.xpath('a/@href').extract()
            desc = sel.xpath('text()').extract()
            for i in title:
                print i,
            for j in link2:
                print j,"+++++++++++++"
        #====================================
        yield etaoItem_loader.load_item()

能分析一些東西,但還不夠,還需繼續分析返回來的動態頁面的原始碼,更改抽取器extractor,選擇器selector(還未開始難過),以便得到想要的結果。selenium包好像沒用上。

#=============================================

滷主參考的一些資料: