7

我对 Python(和网络抓取)非常陌生。让我问你一个问题。

许多网站实际上并没有在 Firefox 或其他浏览器中报告其特定的 URL。例如,Social Security Admin 显示带有排名的流行婴儿名字(自 1880 年以来),但是当我将年份从 1880 更改为 1881 时,url 并没有改变。它是不断的,

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

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

在此页面源中,它包括:

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

所以大概,如果我能控制这个“年份”值(比如,“1881”或“1991”),我可以处理这个问题。我对吗?我仍然不知道该怎么做。

有人可以告诉我解决方案吗?

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

谢谢!

4

4 回答 4

7

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

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 编码的参数:

urllib.urlopen(url, post_args)

如果您还需要发送标头:

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...
于 2013-06-20T18:59:00.163 回答
3

我建议使用Scrapy。这是一个非常强大且易于使用的网络抓取工具。为什么值得尝试:

  1. 速度/性能/效率

    Scrapy 是用 Twisted 编写的,这是一个流行的 Python 事件驱动网络框架。因此,它是使用非阻塞(又名异步)代码来实现并发的。

  2. 数据库流水线

    Scrapy 具有Item Pipelines以下特点:

    一个项目被蜘蛛抓取后,它被发送到项目管道,该管道通过几个按顺序执行的组件来处理它。

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

  3. 代码组织

    Scrapy 为您提供了一个漂亮而清晰的项目结构,您可以在其中逻辑分离设置、蜘蛛、项目、管道等。即便如此,您的代码也更清晰,更易于支持和理解。

  4. 编码时间

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

是的,你明白了——我喜欢它。

为了开始:

希望有帮助。

于 2013-06-20T19:24:30.023 回答
2

我建议使用诸如mechanize之类的工具。这将允许您使用 python 以编程方式导航网页。有很多关于如何使用它的教程。基本上,您在 mechanize 中要做的与在浏览器中所做的相同:填充文本框,点击“Go”按钮并解析从响应中获得的网页。

于 2013-06-20T18:33:42.463 回答
2

我以前用过 mechanoid/BeautifulSoup 库来处理类似的东西。如果我现在有这样的项目,我也会看看https://github.com/scrapy/scrapy

于 2013-06-20T19:00:17.753 回答