2017-10-06 49 views
-2

我對網絡剪輯的瞭解不多我已經開始爲我找到一個非常複雜的問題,我會盡力解釋我所能做到的最好的(因此,我已經開放了我的文章中的建議或編輯)。如何使用Selenium在scrapy中生成片段URL?

我很早以前就開始使用網絡抓取框架'Scrapy'來進行網絡掃描,而且它仍然是我現在使用的那個。最近,我碰到了this website,發現我的框架(Scrapy)無法遍歷頁面,因爲此網站使用Fragment URLs(#)加載數據(下一頁)。然後我提出了一個關於這個問題的帖子(不知道主要問題):my post

之後,我意識到我的框架不能使它沒有JavaScript解釋器或瀏覽器模仿,所以他們提到了Selenium庫。我儘可能多地閱讀該庫(即example1,example2,example3example4)。我還發現這StackOverflow's post,提供了一些關於我的問題的軌道。

所以最後,我最大的問題是:

1 -有什麼辦法來遍歷/在從網站上面顯示的頁面產量,使用Selenium與scrapy一起? 到目前爲止,這是我使用的代碼,但沒有工作...

編輯:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

# The require imports... 

def getBrowser(): 
    path_to_phantomjs = "/some_path/phantomjs-2.1.1-macosx/bin/phantomjs" 
    dcap = dict(DesiredCapabilities.PHANTOMJS) 
    dcap["phantomjs.page.settings.userAgent"] = (
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/53 " 
    "(KHTML, like Gecko) Chrome/15.0.87") 
    browser = webdriver.PhantomJS(executable_path=path_to_phantomjs, desired_capabilities=dcap) 

    return browser 

class MySpider(Spider): 
    name = "myspider" 

    browser = getBrowser() 

    def start_requests(self): 
     the_url = "http://www.atraveo.com/es_es/islas_canarias#eyJkYXRhIjp7ImNvdW50cnlJZCI6IkVTIiwicmVnaW9uSWQiOiI5MjAiLCJkdXJhdGlvbiI6NywibWluUGVyc29ucyI6MX0sImNvbmZpZyI6eyJwYWdlIjoiMCJ9fQ==" 

     yield scrapy.Request(url=the_url, callback=self.parse, dont_filter=True) 

    def parse(self, response): 
     self.get_page_links() 

    def get_page_links(self): 
     """ This first part, goes through all available pages """ 

     for i in xrange(1, 3): # 210 
      new_data = {"data": {"countryId": "ES", "regionId": "920", "duration": 7, "minPersons": 1}, 
        "config": {"page": str(i)}} 
      json_data = json.dumps(new_data) 
      new_url = "http://www.atraveo.com/es_es/islas_canarias#" + base64.b64encode(json_data) 
      self.browser.get(new_url) 
      print "\nThe new URL is -> ", new_url, "\n" 
      content = self.browser.page_source 
      self.get_item_links(content) 

    def get_item_links(self, body=""): 
     if body: 
      """ This second part, goes through all available items """ 
      raw_links = re.findall(r'listclickable.+?>', body) 
      links = [] 
      if raw_links: 
       for raw_link in raw_links: 
        new_link = re.findall(r'data-link=\".+?\"', raw_link)[0].replace("data-link=\"", "").replace("\"", 
                              "") 
        links.append(str(new_link)) 

       if links: 
        ids = self.get_ids(links) 
        for link in links: 
         current_id = self.get_single_id(link) 
         print "\nThe Link -> ", link 
         # If commented the line below, code works, doesn't otherwise 
         yield scrapy.Request(url=link, callback=self.parse_room, dont_filter=True)                   

    def get_ids(self, list1=[]): 
     if list1: 
      ids = [] 
      for elem in list1: 
       raw_id = re.findall(r'/[0-9]+', elem)[0].replace("/", "") 
       ids.append(raw_id) 

      return ids 

     else: 
      return [] 

    def get_single_id(self, text=""): 
     if text: 
      raw_id = re.findall(r'/[0-9]+', text)[0].replace("/", "") 
      return raw_id 

     else: 
      return "" 

    def parse_room(self, response): 
     # More scraping code... 

因此,這主要是我的問題。我幾乎可以肯定,我所做的並不是最好的方式,所以爲此我做了第二個問題。爲了避免將來要做這些事情,我做了第三個問題。

2 -如果第一個問題的答案是否定的,我該如何解決這個問題?我打開另一種手段,否則

3 -誰能告訴我,或告訴我在哪裏我可以學習如何解決/沿着JavaScript和Ajax結合webscraping頁面?現在更多的網站使用JavaScript和Ajax腳本來加載內容

非常感謝提前!

+0

[使用Selenium + Scrapy]的可能重複(https://stackoverflow.com/questions/41571456/using-selenium-scrapy) – parik

+0

我已經編輯了@parik – wj127

回答

1

你看過BeautifulSoup?這是一個非常流行的python網絡抓取庫。至於JavaScript,我會推薦像Cheerio(如果你要求在JavaScript中提供一個抓取庫)

如果你的意思是說網站使用HTTP請求來加載內容,你總是可以嘗試操縱手動使用請求庫。

希望這有助於

+0

謝謝你的答案隊友,但我'我已經對我的帖子進行了一些編輯,請再看看,如果你想@ JC1 – wj127

1

你絕對可以使用Selenium作爲一個獨立的報廢與動態內容(如AJAX加載)網頁。

硒只會依靠一個WebDriver(基本上是一個Web瀏覽器)來通過Internet來搜索內容。

這裏有幾個人(但最常用的)

  • ChromeDriver
  • PhantomJS(我的最愛)
  • 火狐

一旦你開始了,你可以啓動你的機器人並解析網頁的html內容。

我包括一個最小的工作下面的例子使用Python和ChromeDriver:

​​

詳情請參閱the documentation

+0

我知道你寫的或多或少。我已經對我的帖子進行了一些編輯,請再次查看@ rak007 – wj127

1

Selenium是抓取動態數據的最佳工具之一。您可以使用硒與任何Web瀏覽器來獲取從腳本加載的數據。這工作完全像瀏覽器點擊操作。但我不喜歡它。

要獲取動態數據,您可以使用scrapy + splash組合。從scrapy你將獲得所有的靜態數據和飛濺其他動態內容。

+0

非常感謝您的回答。不過,我已經對我的帖子進行了一些編輯,以便有更具體的答案,請看一看! @阿倫奧古斯丁:) – wj127