標籤:scrapy python selenium 動態網站 爬取
preface:最近學習工作之外,有個異性朋友需要爬取動態網頁的要求,輸入關鍵詞爬取某個專利網站在該關鍵詞下的一些專利說明。以往直接python urllib2可破,但是那隻是對於靜態網頁可破,但是對於用js等其他的產生的動態網頁的話,則貌似不行(沒試過)。然後在網上找了些資料,發現scrapy結合selenium包好像可以。(之所以這麼說,暫時鹵主也還沒實現,先記錄下來。)
#=====================根據官網中簡單的介紹作個人理解========================
首先,安裝scrapy,selenium兩個包:
鹵主在ubuntu下,並且已經安裝好了anaconda和pip以及easy_intasll,所以直接用pip安裝一步到位(或者easy_install):
pip install -U seleniumpip install Scrapyeasy_install -U seleniumeasy_install Scrapy
其次,需要用scrapy建立項目,在終端運行如下命令建立項目:
scrapy startproject tutorial
則自動產生如下形式的檔案夾:
Figure 1:建立項目後的檔案夾
再次,開始編寫項目:
在items.py檔案中需要定義一些變數:
import scrapyclass DmozItem(scrapy.Item): title = scrapy.Field() link = scrapy.Field() desc = scrapy.Field()
在檔案夾
tutorial/spiders
下建立
dmoz_spider.py
檔案:
import scrapyclass 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這三個變數。
最後,在最外層檔案夾下終端運行:
<span style="font-size:18px;">scrapy crawl dmoz</span>
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包好像沒用上。
#=============================================
鹵主參考的一些資料:
scrapy官網:http://doc.scrapy.org/en/latest/intro/tutorial.html
selenium官網:http://selenium-python.readthedocs.org/
scrapy選取器:http://doc.scrapy.org/en/0.24/topics/selectors.html#topics-selectors
博友部落格:http://chenqx.github.io/2014/12/23/Spider-Advanced-for-Dynamic-Website-Crawling/
博友部落格:http://chenqx.github.io/2014/11/09/Scrapy-Tutorial-for-BBSSpider/
博友部落格(selenium):http://www.cnblogs.com/fnng/archive/2013/05/29/3106515.html
存取問題:http://my.oschina.net/HappyRoad/blog/173510
python scrapy爬取動態網頁面