一个(大概是基本的)网页抓取http://www.ssa.gov/cgibin/popularnames.cgi在urllib中

2024-09-28 20:17:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python(和web抓取)很陌生。让我问你一个问题。在

实际上,许多网站并不在Firefox或其他浏览器中报告其特定的url。例如,社会保险管理显示流行的婴儿名字和等级(从1880年开始),但当我把年份从1880年改为1881年时,网址没有改变。它是不断的

http://www.ssa.gov/cgi-bin/popularnames.cgi

因为我不知道具体的网址,我无法下载网页使用urllib。在

在此页面源中,它包括:

<input type="text" name="year" id="yob" size="4" value="1880">

所以假设,如果我能控制这个“年”值(比如“1881”或“1991”),我就可以处理这个问题。我说得对吗?我还是不知道怎么做。在

有谁能告诉我解决这个问题的办法吗?在

如果你知道一些有助于我学习的网站,请告诉我。在

谢谢!在


Tags: webhttpurl网站www报告浏览器firefox
3条回答

我建议使用mechanize之类的工具。这将允许您使用python以编程方式导航web页面。有很多关于如何使用这个的教程。基本上,你想在mechanize中做的和在浏览器中做的一样:填充文本框,点击“Go”按钮,解析你从响应中得到的网页。在

您仍然可以使用urllib。该按钮执行对当前url的发布。使用Firefox的Firebug我查看了网络流量,发现它们发送了3个参数:membertop,和{}。您可以发送相同的参数:

import urllib
url = 'http://www.ssa.gov/cgi-bin/popularnames.cgi'

post_params = { # member was blank, so I'm excluding it.
    'top'  : '25',
    'year' : year
    }
post_args = urllib.urlencode(post_params)

现在,只需发送url编码的参数:

^{pr2}$

如果您还需要发送邮件头:

headers = {
    'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language' : 'en-US,en;q=0.5',
    'Connection' : 'keep-alive',
    'Host' : 'www.ssa.gov',
    'Referer' : 'http://www.ssa.gov/cgi-bin/popularnames.cgi',
    'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0'
    }

# With POST data:
urllib.urlopen(url, post_args, headers)

在循环中执行代码:

for year in xrange(1880, 2014):
    # The above code...

我建议使用Scrapy。这是一个非常强大和易于使用的网页抓取工具。值得尝试的原因:

  1. 速度/性能/效率

    Scrapy is written with Twisted, a popular event-driven networking framework for Python. Thus, it’s implemented using a non-blocking (aka asynchronous) code for concurrency.

  2. 数据库流水线

    Scrapy具有Item Pipelines功能:

    After an item has been scraped by a spider, it is sent to the Item Pipeline which process it through several components that are executed sequentially.

    因此,每一页都可以在下载后立即写入数据库。

  3. 代码组织

    Scrapy为你提供了一个很好的清晰的项目结构,在那里你有设置,蜘蛛,项目,管道等逻辑分离。即便如此,你的代码也会更清晰、更易于支持和理解。

  4. 编码时间到了

    Scrapy在幕后为你做了很多工作。这将使您专注于实际的代码和逻辑本身,而不是考虑“金属”部分:创建进程、线程等。

是的,你懂的-我喜欢。在

为了开始:

希望有帮助。在

相关问题 更多 >