Python刮板机械化/ javascript

时间:2013-06-13 11:19:23

标签: javascript python web-scraping web-crawler mechanize-python

我必须从this site获取前美国州长的所有信息。但是,要读出结果然后按照链接,我需要访问不同的结果页面,或者,最好只是将每页显示的结果限制设置为最大值100(我不认为有超过100个)每个州的结果)。但是,页面信息似乎使用javascript,不是表单的一部分,似乎我无法将其作为控件访问。

有关如何进行的任何信息?我是python的新手,只是不时用它来做这样的任务。这是一些简单的代码,它遍历主窗体。

import mechanize
import lxml.html
import csv

site = "http://www.nga.org/cms/FormerGovBios"
output = csv.writer(open(r'output.csv','wb'))
br = mechanize.Browser()

response = br.open(site)
br.select_form(name="governorsSearchForm")
states = br.find_control(id="states-field", type="select").items
for pos, item in enumerate(states[1:2]): 
    statename = str([label.text for label in item.get_labels()])
    print pos, item.name, statename, len(states)
    br.select_form(name="governorsSearchForm")
    br["state"] = [item.name]
    response = br.submit(name="submit", type="submit")
    # now set page limit to 100, get links and descriptions\
    # and follow each link to get information
    for form in br.forms():
        print "Form name:", form.name
        print form, "\n"
    for link in br.links():
        print link.text, link.url

5 个答案:

答案 0 :(得分:2)

我用硒解决了这个问题。它是完整的firefox(或其他)浏览器,您可以在代码中进行操作。

答案 1 :(得分:1)

您可以使用PySide绑定QtWebKit。使用QtWebKit,您可以检索使用Javascript的页面,并在Javascript填充html后解析它。所以你不需要了解Javascript。其他选择包括SeleniumPhantomJS

答案 2 :(得分:0)

答案 3 :(得分:0)

请注意,该页面上的select元素会更改window.location

我认为只需将$('#pageSizeSelector....-..-..-..-....').val()替换为您需要的值,即可构建适当的URI来加载页面。

答案 4 :(得分:0)

好的,这是一个搞乱的方法。使用不同的搜索设置,我发现要显示的结果数量在网址中。因此我将其更改为每页3000个,因此它只适用于1页。

http://www.nga.org/cms/FormerGovBios?begincac77e09-db17-41cb-9de0-687b843338d0=0&higherOfficesServed=&lastName=&sex=Any&honors=&submit=Search&state=Any&college=&party=&inOffice=Any&biography=&race=Any&birthState=Any&religion=&militaryService=&firstName=&nbrterms=Any&warsServed=&&pagesizecac77e09-db17-41cb-9de0-687b843338d0=3000

在它需要一段时间的lodes之后我会右键单击并转到查看页面源。将其复制到我的计算机上的文本文件中。然后我可以从文件中删除我需要的信息,而无需去服务器并且必须处理javascript。

我可以推荐"BeautifulSoup"来浏览html文件。