需要登陆⽹站后才能获取数据的页⾯爬取
⽬的是万⼀博主⽹站⽆法访问到的话⾃⼰需要学习的东西可就不存在了.
本⽂需要学习的地⽅,使⽤三种不同的⽅式爬取需要登录才能获取数据的⽹站数据
POST 请求⽅法:需要在后台获取登录的 URL并填写请求体参数,然后 POST 请求登录,相对⿇烦;
添加 Cookies ⽅法:先登录将获取到的 Cookies 加⼊ Headers 中,最后⽤ GET ⽅法请求登录,这种最为⽅便;
Selenium 模拟登录:代替⼿⼯操作,⾃动完成账号和密码的输⼊,简单但速度⽐较慢。
对于很多要先登录的⽹站来说,模拟登录往往是爬⾍的第⼀道坎。本⽂介绍 POST 请求登录、获取 Cookies 登录、Seleium 模拟登录三种⽅法。
摘要:在进⾏爬⾍时,除了常见的不⽤登录就能爬取的⽹站,还有⼀类需要先登录的⽹站。⽐如⾖瓣、知乎,以及上⼀篇⽂章中的桔⼦⽹。这⼀类⽹站⼜可以分为:只需输⼊帐号密码、除了帐号密码还需输⼊或点击验证码等类型。本⽂以只需输⼊账号密码就能登录的桔⼦⽹为例,介绍模拟登录常⽤的 3 种⽅法。
POST 请求⽅法:需要在后台获取登录的 URL并填写请求体参数,然后 POST 请求登录,相对⿇烦;
添加 Cookies ⽅法:先登录将获取到的 Cookies 加⼊ Headers 中,最后⽤ GET ⽅法请求登录,这种最为⽅便;
Selenium 模拟登录:代替⼿⼯操作,⾃动完成账号和密码的输⼊,简单但速度⽐较慢。
下⾯,我们⽤代码分别实现上述 3 种⽅法。
1. ⽬标⽹页
这是我们要获取内容的⽹页:
这个⽹页需要先登录才能看到数据信息,登录界⾯如下:
可以看到,只需要输⼊账号和密码就可以登录,不⽤输验证码,⽐较简单。下⾯我们利⽤⼀个测试账号和密码,来实现模拟登录。
2. POST 提交请求登录
⾸先,我们要到 POST 请求的 URL。
有两种⽅法,第⼀种是在⽹页 devtools 查看请求,第⼆种是在 Fiddler 软件中查看。
先说第⼀种⽅法。
在登录界⾯输⼊账号密码,并打开开发者⼯具,清空所有请求,接着点击登录按钮,这时便会看到有⼤量请求产⽣。哪⼀个才是 POST 请求的 URL呢?这个需要⼀点经验,因为是登录,所以可以尝试点击带有「login」字眼的请求。这⾥我们点击第四个请求,在右侧 Headers 中可以看到请求的 URL,请求⽅式是 POST类型,说明 URL 对了。
接着,我们下拉到 Form Data,这⾥有⼏个参数,包括 identify 和 password,这两个参数正是我们登录时需要输⼊的账号和密码,也就是POST 请求需要携带的参数。
参数构造⾮常简单,接下来只需要利⽤ Requests.post ⽅法请求登录⽹站,然后就可以爬取内容了。
下⾯,我们尝试⽤ Fiddler 获取 POST 请求。
如果你对 Fiddler 还不太熟悉或者没有电脑上没有安装,可以先了解和安装⼀下。
Fiddler 是位于客户端和服务器端的 HTTP 代理,也是⽬前最常⽤的 HTTP 抓包⼯具之⼀。它能够记录客户端和服务器之间的所有 HTTP 请求,可以针对特定的 HTTP 请求,分析请求数据、设置断点、调试 web 应⽤、修改请求的数据,甚⾄可以修改服务器返回的数据,功能⾮常强⼤,是 web 调试的利器。
Fiddler 下载地址:
使⽤教程:
下⾯,我们就通过 Fiddler 截取登录请求。
当点击登录时,官场 Fiddler 页⾯,左侧可以看到抓取了⼤量请求。通过观察,第15个请求的 URL中含有「login」字段,很有可能是登录的POST 请求。我们点击该请求,回到右侧,分别点击「inspectors」、「Headers」,可以看到就是 POST 请求,该 URL 和上⾯的⽅法获取
的 URL 是⼀致的。
接着,切换到右侧的 Webforms 选项,可以看到 Body 请求体。也和上⾯⽅法中得到的⼀致。
获取到 URL 和请求体参数之后,下⾯就可以开始⽤ Requests.post ⽅法模拟登录了。
代码如下:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chro
me/66.0.3359.181 Safari/537.36',
}
data = {
'identity':'irw27812@awsoo',
'password':'test2018',
}
url ='www.itjuzi/user/login?redirect=&flag=&radar_coupon='
session = requests.Session()
session.post(url,headers = headers,data = data)
# 登录后,我们需要获取另⼀个⽹页中的内容
response = ('radar.itjuzi/investevent',headers = headers)
print(response.status_code)
)
使⽤ session.post ⽅法提交登录请求,然后⽤ ⽅法请求⽬标⽹页,并输出 HTML代码。可以看到,成功获取到了⽹页内容。
下⾯,介绍第 2 种⽅法。
3. 获取 Cookies,直接请求登录
上⾯⼀种⽅法,我们需要去后台获取 POST 请求链接和参数,⽐较⿇烦。下⾯,我们可以尝试先登录,获取 Cookie,然后将该 Cookie 添加到 Headers 中去,然后⽤ GET ⽅法请求即可,过程简单很多。
代码如下:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chro
me/66.0.3359.181 Safari/537.36',
'Cookie': '你的cookie',
}
url = 'www.itjuzi/user/login?redirect=&flag=&radar_coupon='
session = requests.Session()
response = ('radar.itjuzi/investevent', headers=headers)
print(response.status_code)
)
可以看到,添加了 Cookie 后就不⽤再 POST 请求了,直接 GET 请求⽬标⽹页即可。可以看到,也能成功获取到⽹页内容。
下⾯介绍第 3 种⽅法。
4. Selenium 模拟登录
这个⽅法很直接,利⽤ Selenium 代替⼿动⽅法去⾃动输⼊账号密码然后登录就⾏了。
关于 Selenium 的使⽤,在之前的⼀篇⽂章中有详细介绍,如果你不熟悉可以回顾⼀下:
代码如下:
from selenium import webdriver
from selenium.webdrivermon.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
browser.maximize_window() # 最⼤化窗⼝
wait = WebDriverWait(browser, 10) # 等待加载10s
def login():
<('www.itjuzi/user/login')
input = wait.until(EC.presence_of_element_located(
(By.XPATH, '//*[@id="create_account_email"]')))
input.send_keys('irw27812@awsoo')
input = wait.until(EC.presence_of_element_located(
(By.XPATH, '//*[@id="create_account_password"]')))
input.send_keys('test2018')
submit = wait.until(EC.element_to_be_clickable(
selenium获取cookie(By.XPATH, '//*[@id="login_btn"]')))
submit.click() # 点击登录按钮
get_page_index()
def get_page_index():
<('radar.itjuzi/investevent')
try:
print(browser.page_source) # 输出⽹页源码
except Exception as e:
print(str(e))
login()
这⾥,我们在⽹页中⾸先定位了账号节点位置:'//*[@id="create_account_email"]',然后⽤ input.send_keys ⽅法输⼊账号,同理,定位了密码框位置并输⼊了密码。接着定位登录按钮的位置://*[@id="login_btn"],然后⽤ submit.click() ⽅法实现点击登录按钮操作,从⽽完成登录。可以看到,也能成功获取到⽹页内容。
以上就是模拟需登录⽹站的⼏种⽅法。当登录进去后,就可以开始爬取所需内容了。
5. 总结:
本⽂分别实现了模拟登录的 3 种操作⽅法,建议优先选择第 2 种,即先获取 Cookies 再 Get 请求直接登录的⽅法。
本⽂模拟登录的⽹站,仅需输⼊账号密码,不需要获取相关加密参数,⽐如 Authenticity_token ,同时也⽆需输⼊验证码,所以⽅法⽐较简单。但是还有很多⽹站模拟登录时,需要处理加密参数、验证码输⼊等问题。后续将会介绍。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论