尝试使用python访问受密码保护的URL

时间:2015-04-21 11:50:17

标签: python python-3.x web-scraping urllib

我在访问www.bizi.si时遇到了问题,或者更具体地说 例如http://www.bizi.si/BALMAR-D-O-O/。如果您在未注册的情况下查看它,您将看不到任何财务数据。但是如果你使用免费注册,我用的是用户名:Lukec,密码:lukec12345,你可以看到一些财务数据。我已经使用了下一个代码:

import urllib.parse
import urllib.request
import re
import csv

username = 'Lukec'
password = 'lukec12345'
url = 'http://www.bizi.si/BALMAR-D-O-O/'
values = {'username':username, 'password':password}
data = urllib.parse.urlencode(values)
data = data.encode('utf-8')
req = urllib.request.Request(url,data,values)
resp = urllib.request.urlopen(req,data)
respData = resp.read()

paragraphs = re.findall('<tbody>(.*?)</tbody>',str(respData))

我的len(段落)为零。如果你们中的任何人能够告诉我如何正确访问该页面,我将非常感激。我知道长度为零不是最好的指标,但是len(respData)如果我使用我的代码中所述的值,或者如果我从代码中取出它是相同的,所以我知道我没有访问该页面通过用户名,密码。 感谢您提前帮助并度过愉快的一天。

1 个答案:

答案 0 :(得分:1)

这里有两个问题:

  1. 您没有使用POST,但请求GET。
  2. 生成的HTML中没有<tbody>个元素;您的浏览器已自动添加任何此类标记,不要依赖它们。
  3. 要创建POST请求,请使用:

    req = urllib.request.Request(url, data, method='POST')
    resp = urllib.request.urlopen(req)
    

    请注意,我删除了values参数(那些不是标题,第三个位置参数为Request(),并且在使用{{1}时不传递data参数对象。

    返回的结果HTML不一定包含发送到浏览器的相同数据;您可能需要在此处维护会话,并返回网站设置的Cookie。

    使用更好的工具(例如requests libraryBeautifulSoup(后者允许您解析HTML而不必使用正则表达式)来执行此操作要容易得多,这可以与{ {3}}帮助您填写并在网站上提交表单。

    但请注意,页面表单和状态由ASP.NET JavaScript代码管理,即使是robobrowser也不容易进行逆向工程。当您使用浏览器(已为您运行JavaScript代码)登录时,POST如下所示:

    Request

    这比简单的用户名/密码组合更多信息。

    有关如何处理此类网页的方法,请参阅robobrowser project