当前位置:首页 » 编程语言 » python登录网页

python登录网页

发布时间: 2024-09-05 01:52:03

㈠ 如何用 python 爬取需要登录的网站

最近我必须执行一项从一个需要登录的网站上爬取一些网页的操作。它没有我想象中那么简单,因此我决定为它写一个辅助教程。

在本教程中,我们将从我们的bitbucket账户中爬取一个项目列表。

教程中的代码可以从我的Github中找到。

我们将会按照以下步骤进行:

  • 提取登录需要的详细信息

  • 执行站点登录

  • 爬取所需要的数据

  • 在本教程中,我使用了以下包(可以在requirements.txt中找到):

    Python

    1

    2

  • requests

    lxml

  • 步骤一:研究该网站

    打开登录页面

    进入以下页面 “bitbucket.org/account/signin”。你会看到如下图所示的页面(执行注销,以防你已经登录)

    仔细研究那些我们需要提取的详细信息,以供登录之用

    在这一部分,我们会创建一个字典来保存执行登录的详细信息:

    1. 右击 “Username or email” 字段,选择“查看元素”。我们将使用 “name” 属性为 “username” 的输入框的值。“username”将会是 key 值,我们的用户名/电子邮箱就是对应的 value 值(在其他的网站上这些 key 值可能是 “email”,“ user_name”,“ login”,等等)。

    2. 右击 “Password” 字段,选择“查看元素”。在脚本中我们需要使用 “name” 属性为 “password”的输入框的值。“password” 将是字典的 key 值,我们输入的密码将是对应的 value 值(在其他网站key值可能是 “userpassword”,“loginpassword”,“pwd”,等等)。

    3. 在源代码页面中,查找一个名为 “csrfmiddlewaretoken” 的隐藏输入标签。“csrfmiddlewaretoken” 将是 key 值,而对应的 value 值将是这个隐藏的输入值(在其他网站上这个 value 值可能是一个名为 “csrftoken”,“authenticationtoken”的隐藏输入值)。列如:“”。

    最后我们将会得到一个类似这样的字典:

    Python

    1

    2

    3

    4

    5

  • payload = {

    "username": "<USER NAME>",

    "password": "<PASSWORD>",

    "csrfmiddlewaretoken": "<CSRF_TOKEN>"

    }

  • 请记住,这是这个网站的一个具体案例。虽然这个登录表单很简单,但其他网站可能需要我们检查浏览器的请求日志,并找到登录步骤中应该使用的相关的 key 值和 value 值。

    步骤2:执行登录网站

    对于这个脚本,我们只需要导入如下内容:

    Python

    1

    2

  • import requests

    from lxml import html

  • 首先,我们要创建session对象。这个对象会允许我们保存所有的登录会话请求。

    Python

    1

  • session_requests = requests.session()

  • 第二,我们要从该网页上提取在登录时所使用的 csrf 标记。在这个例子中,我们使用的是 lxml 和 xpath 来提取,我们也可以使用正则表达式或者其他的一些方法来提取这些数据。

    Python

    1

    2

    3

    4

    5

  • login_url = "n/?next=/"

    result = session_requests.get(login_url)

    tree = html.fromstring(result.text)

    authenticity_token = list(set(tree.xpath("//input[@name='csrfmiddlewaretoken']/@value")))[0]

  • **更多关于xpath 和lxml的信息可以在这里找到。

    接下来,我们要执行登录阶段。在这一阶段,我们发送一个 POST 请求给登录的 url。我们使用前面步骤中创建的 payload 作为 data 。也可以为该请求使用一个标题并在该标题中给这个相同的 url添加一个参照键。

    Python

    1

    2

    3

    4

    5

  • result = session_requests.post(

    login_url,

    data = payload,

    headers = dict(referer=login_url)

    )

  • 步骤三:爬取内容

    现在,我们已经登录成功了,我们将从bitbucket dashboard页面上执行真正的爬取操作。

    Python

    1

    2

    3

    4

    5

  • url = '/overview'

    result = session_requests.get(

    url,

    headers = dict(referer = url)

    )

  • 为了测试以上内容,我们从 bitbucket dashboard 页面上爬取了项目列表。我们将再次使用 xpath 来查找目标元素,清除新行中的文本和空格并打印出结果。如果一切都运行 OK,输出结果应该是你 bitbucket 账户中的 buckets / project 列表。

    Python

    1

    2

    3

    4

    5

  • tree = html.fromstring(result.content)

    bucket_elems = tree.findall(".//span[@class='repo-name']/")

    bucket_names = [bucket.text_content.replace("n", "").strip() for bucket in bucket_elems]

    print bucket_names

  • 你也可以通过检查从每个请求返回的状态代码来验证这些请求结果。它不会总是能让你知道登录阶段是否是成功的,但是可以用来作为一个验证指标。

    例如:

    Python

    1

    2

  • result.ok # 会告诉我们最后一次请求是否成功

    result.status_code # 会返回给我们最后一次请求的状态

㈡ Python模拟登录知乎,为什么403 forbidden了

1. 找到正确的登录链接,应该是:self.baseUrl + '/login/email'
2. 这个request.Request(self.baseUrl + '/#signin', postdata.encode('utf-8'))没用过不清楚,所以不知道有没有带上前两个请求的cookies。我是改成:
self.opener.open(self.baseUrl + '/login/email', postdata.encode('utf-8'))这样访问的。

通常登录403问题都是:
1. 登录api不对,
2. 前后访问没有带cookies,导致token无效、验证码无效。

附上改后的,只会用requests的我,请勿喷啊~~~:
import cookielib,urllib2
import re,urllib,json

class ZhiHuSpider(object):
def __init__(self):
self.baseUrl = 'http://www.hu.com/'
self.captchaUrl = 'http://www.hu.com/captcha.gif?r='
self.cookies = cookielib.CookieJar()
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies))
# 获取网页xsrf值
def getXsrf(self):
html = None
html = self.opener.open(self.baseUrl).read().decode('utf-8')
xsrf_match = re.search(r'name="_xsrf" value="(.*?)"/>', html)
if xsrf_match:
return xsrf_match.group(1).strip()

# 将验证码保存在本地
def getCaptchaCode(self):
data = self.opener.open(self.captchaUrl).read()
fName = self.captchaUrl.split('/')[3].split('?')[0]
f = open(fName, 'wb')
f.write(data)
f.close()
print(u'验证码已保存在本地!请查看!')

# 模拟登录知乎
def login(self):
form = { '_xsrf': self.getXsrf(),
'email': '[email protected]',
'password': 'password' }
self.getCaptchaCode()
code = input(u'请输入验证码:')
form['captcha'] = code
postdata = urllib.urlencode(form)#parse.urlencode(form)
op = self.opener.open(self.baseUrl + '/login/email', postdata.encode('utf-8'))
#req = request.Request(self.baseUrl + '/#signin', postdata.encode('utf-8'))
a = op.read().decode()
a=json.loads(a)
print a,type(a)
print a['msg']

if __name__ == '__main__':
spider = ZhiHuSpider()
spider.login()

㈢ 使用python是否能打开网页

可以啊,不仅可以打开,还可以将网页的内容爬取下来

下面这段代码就可以实现:

importurllib.request

#网址
url="http://www..com/"

#请求
request=urllib.request.Request(url)

#爬取结果
response=urllib.request.urlopen(request)

data=response.read()

#设置解码方式
data=data.decode('utf-8')

#打印结果
print(data)

#打印爬取网页的各类信息

print(type(response))
print(response.geturl())
print(response.info())
print(response.getcode())

它的运行结果如下:

你可以拷贝到自己的运行环境去试一试

热点内容
如何将安卓机设置为苹果机 发布:2024-11-25 09:41:24 浏览:969
服务器屏蔽一段ip 发布:2024-11-25 08:52:06 浏览:100
售茶源码 发布:2024-11-25 08:37:29 浏览:463
压缩包改直链 发布:2024-11-25 08:34:33 浏览:611
安卓机的照片如何传送到苹果机上 发布:2024-11-25 08:32:48 浏览:917
手游服务器怎么找ip 发布:2024-11-25 08:23:10 浏览:752
c语言名次 发布:2024-11-25 08:04:22 浏览:56
新浪云服务器登录 发布:2024-11-25 08:04:21 浏览:854
工控机服务器电脑的区别 发布:2024-11-25 08:04:21 浏览:514
Python对比matlab 发布:2024-11-25 07:45:58 浏览:307