【发布时间】:2017-10-06 11:02:03
【问题描述】:
由于我对网络抓取知之甚少,我发现了一个对我来说非常复杂的问题,我会尽力解释(因此我愿意接受我的帖子中的建议或编辑)。
我很久以前就开始使用网络爬虫框架“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 的网页抓取的页面?现在越来越多的网站使用 JavaScript 和 Ajax 脚本来加载内容
非常感谢!
【问题讨论】:
-
我已经编辑了@parik
标签: javascript python selenium web-scraping scrapy