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

Hyu*_*yun 6 python firebug cgi urllib web-scraping

我是Python(和网络抓取)的新手.让我问你一个问题.

许多网站实际上并未在Firefox或其他浏览器中报告其特定URL.例如,社会安全管理员显示具有等级的流行婴儿名字(自1880年以来),但当我将年份从1880年改为1881年时,网址不会改变.它是不断的,

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

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

在此页面源中,它包括:

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

所以,假设我可以控制这个"年"值(比如"1881"或"1991"),我可以解决这个问题.我对吗?我还是不知道怎么做.

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

如果您了解一些可能有助于我学习的网站,请告知我们.

谢谢!

Tha*_*Guy 7

你仍然可以使用urllib.该按钮对当前URL执行POST.使用Firefox的Firebug的我看了一下网络流量,发现他们发出3个参数:member,top,和year.您可以发送相同的参数:

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)
Run Code Online (Sandbox Code Playgroud)

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

urllib.urlopen(url, post_args)
Run Code Online (Sandbox Code Playgroud)

如果您还需要发送标头:

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)
Run Code Online (Sandbox Code Playgroud)

在循环中执行代码:

for year in xrange(1880, 2014):
    # The above code...
Run Code Online (Sandbox Code Playgroud)