我刚刚在Python中使用Scraperwiki。已经弄清楚如何从页面刮取表格,每月运行刮刀并将结果保存在彼此之上。很酷。
现在我希望scrape this page提供有关Android版本的信息并每月运行该脚本。特别是,我想要用于版本,代号,API和分发的表。这不容易。
使用包装器div调用该表。有没有办法搞这些信息?我找不到任何解决方案。
计划B是抓取可视化。我最终需要的是代号和百分比,这样就足够了。此信息可在Google Chart脚本的HTML中找到。
但是我无法用我的'sled'HTML找到这些信息。我有a public scraper over here。您可以对其进行编辑以使其正常工作。
任何人都可以解释我如何解决这个问题吗?一个工作刮刀,对正在发生的事情发表评论将是非常棒的。
答案 0 :(得分:1)
由于它是在JavaScript中存储和呈现的,因此原始Python scraper无法执行此代码并查看可视化或表格。
ScraperWiki非常好但是我总是发现,如果你每个月都在做一个页面,那么python脚本+ cron要好得多,如果你需要使用Selenium进行这种JavaScript解析,它python driver是一个更强大的解决方案。
如果安装了selenium服务器,您可以粗略地以下(以伪代码形式)
#!/bin/env python
from selenium import webdriver
browser = webdriver.Firefox()
# Load page with all Javascript rendered in the DOM for you.
browser.get("http://developer.android.com/about/dashboards/index.html")
# Find the table
table = browser.find_element_by_xpath("/html/body/div[3]/div[2]/div/div/div[2]/div/div/table")
# Do something with the table element
# Save the data
browser.close()
然后只需要在一个月的第一天运行脚本的cron作业,如下所示:
0 0 1 * * /path/to/python_script.py
答案 1 :(得分:1)
这实际上是一个很难的案例,因为正如kisamoto所提到的,数据在嵌入式JavaScript中,而不是像您期望的那样在单独的JSON文件中。有可能使用BeautifulSoup,但它会产生一些丑陋的字符串处理:
last_paragraph = soup.find_all('p', style='clear:both')[-1]
script_tag = last_paragraph.next_sibling.next_sibling
script_text = script_tag.text
lines = script_text.split('\n')
data_text = ''
for line in lines:
if 'SCREEN_DATA' in line: break
data_text = data_text + line
data_text = data_text.replace('var VERSION_DATA =', '')
# delete semicolon at the end
data_text = data_text[:-1]
data = json.loads(data_text)
data = data[0]
print data['data']
输出:
[{u'perc': u'0.1', u'api': 4, u'name': u'Donut'}, ... ]