抓取网页数据违法吗(万一博主使用三种不同的方式需要登录才能获取数据的网站数据POST)
优采云 发布时间: 2022-03-27 02:13抓取网页数据违法吗(万一博主使用三种不同的方式需要登录才能获取数据的网站数据POST)
目的是如果博主网站不能访问,他需要学习的东西就不存在了。
本文需要学习的是使用三种不同的方式爬取需要登录获取数据的网站数据
POST请求方式:需要在后台获取登录URL并填写请求体参数,然后POST请求登录,比较麻烦;
添加Cookies方式:先登录,将获取到的Cookies添加到Headers中,最后使用GET方式请求登录,最方便;
Selenium 模拟登录:无需手动操作,自动完成账号密码的输入,简单但速度较慢。
对于很多想先登录的网站来说,模拟登录往往是爬虫的第一道坎。本文介绍三种方式:POST请求登录、获取cookies登录、Seleium模拟登录。
摘要:在爬取的时候,除了常见的网站不用登录也可以爬取,还有一种类型的网站需要先登录。比如豆瓣、知乎、上篇文章中的桔子网文章。这类网站又可以分为:只需输入账号密码,除账号密码外还需要输入或点击验证码。本文以仅输入账号密码即可登录的聚子网为例,介绍三种常用的模拟登录方式。
POST请求方式:需要在后台获取登录URL并填写请求体参数,然后POST请求登录,比较麻烦;
添加Cookies方式:先登录,将获取到的Cookies添加到Headers中,最后使用GET方式请求登录,最方便;
Selenium 模拟登录:无需手动操作,自动完成账号密码的输入,简单但速度较慢。
下面,我们分别用代码实现上述三种方法。
1. 登陆页面
这是我们要获取内容的网页:
该网页需要登录才能查看数据信息。登录界面如下:
可以看到,只需要输入账号和密码即可登录,无需输入验证码,比较简单。接下来,我们使用一个测试账号和密码来实现模拟登录。
2. POST 提交请求以登录
首先,我们需要找到 POST 请求的 URL。
有两种方法,第一种是在网页devtools中查看请求,第二种是在Fiddler软件中查看。
先说第一种方法。
在登录界面输入账号密码,打开开发者工具,清除所有请求,然后点击登录按钮,就会看到生成了大量的请求。POST 请求的 URL 是哪个?这个需要一点经验,因为是登录,所以尽量点击带有“登录”字样的请求。这里我们点击第四个请求,在右侧的header中可以看到请求的URL。请求方式为 POST 类型,表示 URL 正确。
接下来,我们下拉到表单数据。这里有几个参数,包括身份和密码。这两个参数就是我们登录时需要输入的账号和密码,也就是POST请求需要携带的参数。
参数构造非常简单。接下来只需要使用Requests.post方法请求登录网站,然后就可以爬取内容了。
下面,我们尝试使用 Fiddler 获取 POST 请求。
如果你不熟悉 Fiddler 或者你的电脑上没有安装它,你可以先了解并安装它。
Fiddler 是一个客户端和服务器端的 HTTP 代理,也是最常用的 HTTP 数据包捕获工具之一。它可以记录客户端和服务器之间的所有 HTTP 请求。它可以分析请求数据、设置断点、调试 Web 应用程序、修改请求的数据,甚至可以针对特定的 HTTP 请求修改服务器返回的数据。它非常强大。它是一个强大的网络调试工具。
Fiddler下载地址:
使用教程:
接下来,我们通过 Fiddler 拦截登录请求。
点击登录后,在Fiddler官方页面,左侧可以看到很多请求。通过观察,第 15 次请求的 URL 收录一个“登录”字段,很可能是登录的 POST 请求。我们点击请求,回到右边,分别点击“inspectors”和“Headers”,可以看到是一个POST请求,URL和上面方法得到的URL是一样的。
接下来切换到右侧的Webforms选项,可以看到Body请求体。也与上述方法得到的相同。
获取到 URL 和请求体参数后,就可以开始使用 Requests.post 方法模拟登录了。
代码显示如下:
导入请求
标题 = {
'用户代理': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, 像 Gecko) Chrome/6< @6.0.3359.181 Safari/537.36',
}
数据 = {
'身份':'',
'密码':'test2018',
}
网址='#39;
会话 = 请求。会话()
session.post(url, headers = headers, data = data)
# 登录后,我们需要获取另一个网页中的内容
response = session.get('#39;, headers = headers)
打印(response.status_code)
打印(响应。文本)
使用 session.post 方法提交登录请求,然后使用 session.get 方法请求目标页面并输出 HTML 代码。可见,网页内容获取成功。
接下来介绍第二种方法。
3. 获取cookies,直接请求登录
上述方法中,我们需要到后台获取POST请求链接和参数,比较麻烦。接下来,我们可以尝试先登录,获取cookie,然后将cookie添加到Headers中,然后使用GET方式进行请求,过程就简单多了。
代码显示如下:
导入请求
标题 = {
'用户代理': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, 像 Gecko) Chrome/6< @6.0.3359.181 Safari/537.36',
'Cookie': '你的 cookie',
}
网址 = '#39;
会话 = 请求。会话()
响应 = session.get('#39;, headers=headers)
打印(response.status_code)
打印(响应。文本)
可以看到,添加cookie之后,就不需要发起POST请求了,直接GET目标页面即可。可以看到,也可以成功获取到网页内容。
下面介绍第三种方法。
4. Selenium 模拟登录
这个方法很直接,用Selenium代替手动的方法,自动输入账号密码然后登录。
Selenium的使用在上一篇文章文章中有详细介绍,不熟悉的可以复习一下:
代码显示如下:
从硒导入网络驱动程序
从 mon.by 导入
从 selenium.webdriver.support 导入 expected_conditions 作为 EC
从 selenium.webdriver.support.wait 导入 WebDriverWait
浏览器 = webdriver.Chrome()
browser.maximize_window() # 最大化窗口
wait = WebDriverWait(browser, 10) # 等待 10s 加载
定义登录():
browser.get('#39;)
输入 = wait.until(EC.presence_of_element_located(
(By.XPATH, '//*[@id="create_account_email"]')))
input.send_keys('')
输入 = wait.until(EC.presence_of_element_located(
(By.XPATH, '//*[@id="create_account_password"]')))
input.send_keys('test2018')
提交 = wait.until(EC.element_to_be_clickable(
(By.XPATH, '//*[@id="login_btn"]')))
submit.click() # 点击登录按钮
获取页面索引()
def get_page_index():
browser.get('#39;)
尝试:
print(browser.page_source) # 输出网页源代码
例外为 e:
打印(str(e))
登录()
这里,我们先在网页中定位到账号节点位置:'//*[@id="create_account_email"]',然后使用input.send_keys方法输入账号。同样,找到密码框并输入密码。然后定位登录按钮的位置://*[@id="login_btn"],然后使用submit.click()方法实现点击登录按钮的操作,完成登录。可以看到,也可以成功获取到网页内容。
以上是模拟需要登录网站的几种方式。登录后,您可以开始爬取所需的内容。
5. 总结:
本文分别实现了模拟登录的三种操作方式,建议先选择第二种方式,即先获取Cookies,然后直接用Get请求登录的方式。
本文模拟登录网站,只需要输入账号密码,不需要获取Authenticity_token等相关加密参数,也不需要输入验证码,所以方法比较简单. 但是,在模拟登录的时候,还是有很多加密参数、验证码输入等问题需要处理。稍后会介绍。