使用Python的请求的post方法

时间:2015-09-19 15:10:02

标签: python html beautifulsoup python-requests

我正在尝试使用Python请求模块来填充Web表单并使用BeautifulSoup来解析生成的网页以获取其中的链接(实际上是与FITS格式的图像的图像链接),然后保存它。

这是我提交表单的网站:http://tgss.ncra.tifr.res.in/tgss_postage_test.html

我的代码如下:

import requests as r
from bs4 import BeautifulSoup as bs
import shutil

url = "http://tgss.ncra.tifr.res.in/cgi-bin/tgss_postage_test.cgi"
val = { 'raval':'12 00 00.00', 'decval':'-32 00 00.00'}
s1 = r.post(url, data=val)
soup = bs(s1.text,'lxml')
for link in soup.find_all('a'):
    if 'tgss.ncra' in link['href']:
        imgurl = link['href']
        print imgurl
        res = r.get(imgurl, stream=True)
with open('img.fits', 'wb') as out_file:
    shutil.copyfileobj(res.raw, out_file)

对于试用表格值,例如'raval':'12 00 00.00','decval':' - 32 00 00.00'会产生一个包含链接的网页。我无法共享指向结果网页的链接,因为它是一般链接,只有在填写表格后才能查看内容,如上一个链接所示。

从代码中可以看出,我使用BeautifulSoup来解析生成的网页并获得图像链接。 问题是我从我的小代码中获得的链接不正确。当我把它写出来时,我得到一个只有14 kb的图像文件(img.fits)。 如果我手动做同样的事情,我得到一个正确的链接,然后保存的图像是124 kb

我是编程新手,不了解HTML,所以知道出了什么问题会有所帮助吗?它是有问题的网站还是我的代码。

1 个答案:

答案 0 :(得分:0)

您省略了original form发送的几个参数;这些仍然需要

val = {
    'raval': '12 00 00.00',
    'decval': '-32 00 00.00',
    'szval': '0.25',
    'szunit': 'deg',
    'fmtval': 'fits'
}

使用这些附加参数,生成的文件长度为216000字节:

>>> val = { 'raval':'12 00 00.00', 'decval':'-32 00 00.00', 'szval': '0.25', 'szunit': 'deg', 'fmtval': 'fits'}
>>> s1 = r.post(url, data=val)
>>> soup = bs(s1.text,'lxml')
>>> imgurl = soup.select('a[href*=tgss.ncra]')[0]['href']
>>> res = r.get(imgurl, stream=True)
>>> res.headers['content-length']
'216000'

使用CSS selector选择特定网址,可以改善您的BeautifulSoup解析:

soup = bs(s1.content, 'lxml')  # leave decoding to BS4
fits_links = soup.select('a[href*=tgss.ncra]')
if fits_links:
    imgurl = fits_links[0]['href']
    res = r.get(imgurl, stream=True)
    with open('img.fits', 'wb') as out_file:
        r.raw.decode_content = True  # in case compression was used
        shutil.copyfileobj(res.raw, out_file)

我还在那里的原始urllib3连接对象上启用了Content-Encoding压缩处理;如果服务能够实现这样的压缩,那么它将透明地处理解压缩。