我對網絡剪輯的瞭解不多我已經開始爲我找到一個非常複雜的問題,我會盡力解釋我所能做到的最好的(因此,我已經開放了我的文章中的建議或編輯)。如何使用Selenium在scrapy中生成片段URL?
我很早以前就開始使用網絡抓取框架'Scrapy'來進行網絡掃描,而且它仍然是我現在使用的那個。最近,我碰到了this website,發現我的框架(Scrapy)無法遍歷頁面,因爲此網站使用Fragment URLs
(#)加載數據(下一頁)。然後我提出了一個關於這個問題的帖子(不知道主要問題):my post
之後,我意識到我的框架不能使它沒有JavaScript
解釋器或瀏覽器模仿,所以他們提到了Selenium
庫。我儘可能多地閱讀該庫(即example1,example2,example3和example4)。我還發現這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腳本來加載內容
非常感謝提前!
[使用Selenium + Scrapy]的可能重複(https://stackoverflow.com/questions/41571456/using-selenium-scrapy) – parik
我已經編輯了@parik – wj127