如何用 Python 爬取需要登录的网站?,python登录,未经许可,禁止转载!英文
如何用 Python 爬取需要登录的网站?,python登录,未经许可,禁止转载!英文
本文由 编橙之家 - ebigear 翻译,艾凌风 校稿。未经许可,禁止转载!英文出处:Tzahi Vidas。欢迎加入翻译组。
最近我必须执行一项从一个需要登录的网站上爬取一些网页的操作。它没有我想象中那么简单,因此我决定为它写一个辅助教程。
在本教程中,我们将从我们的bitbucket账户中爬取一个项目列表。
教程中的代码可以从我的 Github 中找到。
我们将会按照以下步骤进行:
- 提取登录需要的详细信息
- 执行站点登录
- 爬取所需要的数据
在本教程中,我使用了以下包(可以在 requirements.txt 中找到):
Pythonrequests 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” 的隐藏输入值)。列如:“Vy00PE3Ra6aISwKBrPn72SFml00IcUV8”。
最后我们将会得到一个类似这样的字典:
Pythonpayload = { "username": "<USER NAME>", "password": "<PASSWORD>", "csrfmiddlewaretoken": "<CSRF_TOKEN>" }
请记住,这是这个网站的一个具体案例。虽然这个登录表单很简单,但其他网站可能需要我们检查浏览器的请求日志,并找到登录步骤中应该使用的相关的 key 值和 value 值。
步骤2:执行登录网站
对于这个脚本,我们只需要导入如下内容:
Pythonimport requests from lxml import html
首先,我们要创建 session 对象。这个对象会允许我们保存所有的登录会话请求。
Pythonsession_requests = requests.session()
第二,我们要从该网页上提取在登录时所使用的 csrf 标记。在这个例子中,我们使用的是 lxml 和 xpath 来提取,我们也可以使用正则表达式或者其他的一些方法来提取这些数据。
Pythonlogin_url = "https://bitbucket.org/account/signin/?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 添加一个参照键。
Pythonresult = session_requests.post( login_url, data = payload, headers = dict(referer=login_url) )
步骤三:爬取内容
现在,我们已经登录成功了,我们将从 bitbucket dashboard 页面上执行真正的爬取操作。
Pythonurl = 'https://bitbucket.org/dashboard/overview' result = session_requests.get( url, headers = dict(referer = url) )
为了测试以上内容,我们从 bitbucket dashboard 页面上爬取了项目列表。我们将再次使用 xpath 来查找目标元素,清除新行中的文本和空格并打印出结果。如果一切都运行 OK,输出结果应该是你 bitbucket 账户中的 buckets / project 列表。
Pythontree = 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
你也可以通过检查从每个请求返回的状态代码来验证这些请求结果。它不会总是能让你知道登录阶段是否是成功的,但是可以用来作为一个验证指标。
例如:
Pythonresult.ok # 会告诉我们最后一次请求是否成功 result.status_code # 会返回给我们最后一次请求的状态
就是这样。
相关内容
- Python爬虫实战(5):模拟登录淘宝并获取所有订单,
- 使用python爬虫抓站的一些技巧总结:进阶篇,python爬虫
- 用 Python 做了一个豆瓣用户读书短评下载工具,python短
- 从豆瓣电影批量获取看过这部电影的用户列表,豆瓣用
- Python爬虫入门(1):综述,python爬虫,未经作者许可,
- Python爬虫入门(2):爬虫基础了解,python爬虫,未经作
- Python爬虫入门(3):Urllib库的基本使用,pythonurllib,未
- Python爬虫入门(4):Urllib库的高级用法,pythonurllib,未
- Python爬虫入门(5):URLError异常处理,pythonurlerror,未经
- Python爬虫入门(6):Cookie的使用,pythoncookie,未经作者
评论关闭