问题:urllib 中 http://www.ssa.gov/cgi-bin/popularnames.cgi 的(可能是基本的)网络抓取

我对 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”),我可以处理这个问题。我对吗?我仍然不知道该怎么做。

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

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

谢谢!

解答

您仍然可以使用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...
Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐