POST使用三种不同的方式爬取需要登录才能获取数据

优采云 发布时间: 2021-06-30 05:25

  POST使用三种不同的方式爬取需要登录才能获取数据

  目的是如果博主网站不能访问,你需要学习的东西就不存在了。

  本文需要学习的是使用三种不同的方式爬取需要登录获取数据的网站数据

  对于很多需要先登录的网站来说,模拟登录往往是爬虫的第一道坎。本文介绍POST请求登录、获取cookies登录、Seleium模拟登录三种方式。

  总结:爬取的时候,除了常见的网站不用登录就可以爬取外,还有一种网站需要先登录。比如豆瓣,知乎,还有上一篇文章的橘子网。这种网站又可以分为:只需要账号密码,除账号密码外,还必须输入或点击验证码。本文以只需输入账号密码即可登录的枣树网为例,介绍3种常用的模拟登录方法。

  下面,我们分别用代码实现上述三种方法。

  1. 登陆页面

  这是我们想要获取内容的页面:

  

  此网页需要登录才能看到数据信息,登录界面如下:

  

  可以看到,登录时只需要输入账号和密码即可,不需要输入验证码,比较简单。下面我们使用一个测试账号和密码来实现模拟登录。

  2.POST提交请求登录

  首先,我们需要找到 POST 请求的 URL。

  有两种方法,第一种是在web devtools中查看请求,第二种是在Fiddler软件中查看请求。

  先说第一种方法。

  

  在登录界面输入账号密码,打开开发者工具,清除所有请求,然后点击登录按钮,就会看到生成了大量的请求。哪个是 POST 请求的 URL?这个需要一点经验,因为是登录,所以可以尝试点击带有“登录”二字的请求。这里我们点击第四个请求,可以在右侧的header中看到请求的URL。请求方式为POST类型,表示正确找到了URL。

  

  接下来,我们下拉到表单数据。有几个参数,包括标识和密码。这两个参数是我们登录时需要输入的账号和密码,是POST请求需要携带的参数。

  

  参数结构非常简单。那么你只需要使用Requests.post方法请求登录网站,然后就可以抓取内容了。

  接下来,我们尝试使用 Fiddler 来获取 POST 请求。

  如果您对 Fiddler 不熟悉或者没有在您的电脑上安装它,您可以先了解它并安装它。

  Fiddler 是客户端和服务器端的 HTTP 代理,也是最常用的 HTTP 抓包工具之一。它可以记录客户端和服务器之间的所有 HTTP 请求,分析请求数据,设置断点,调试 Web 应用程序,修改请求的数据,甚至针对特定的 HTTP 请求修改服务器返回的数据。它非常强大。它是一个强大的网络调试工具。

  提琴手下载链接:

  使用教程:

  接下来,我们将通过 Fiddler 拦截登录请求。

  点击登录后,在官方的Fiddler页面,左侧可以看到大量的请求。通过观察,第15个请求URL收录“登录”字段,很可能是登录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) Chrome/66.0.3359.181 Safari/537.36',

}

data = {

'identity':'irw27812@awsoo.com',

'password':'test2018',

}

url ='https://www.itjuzi.com/user/login?redirect=&flag=&radar_coupon='

session = requests.Session()

session.post(url,headers = headers,data = data)

# 登录后,我们需要获取另一个网页中的内容

response = session.get('http://radar.itjuzi.com/investevent',headers = headers)

print(response.status_code)

print(response.text)

  使用 session.post 方法提交登录请求,然后使用 session.get 方法请求目标网页并输出 HTML 代码。可以看到,成功获取了网页内容。

  

  接下来介绍第二种方法。

  3. 获取cookies,直接请求登录

  上述方法中,我们需要到后台获取POST请求链接和参数,比较麻烦。接下来,我们可以尝试先登录,获取cookie,然后将cookie添加到header中,然后使用GET方法进行请求,过程就简单多了。

  代码如下:

  import requests

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',

'Cookie': '你的cookie',

}

url = 'https://www.itjuzi.com/user/login?redirect=&flag=&radar_coupon='

session = requests.Session()

response = session.get('http://radar.itjuzi.com/investevent', headers=headers)

print(response.status_code)

print(response.text)

  如您所见,添加cookies后不需要POST请求,直接GET目标网页即可。可以看到,网页的内容也可以成功获取。

  

  下面介绍第三种方法。

  4.Selenium 模拟登录

  这个方法非常简单。代替手动方法,使用Selenium自动输入账号密码并登录。

  关于Selenium的使用,上一篇文章有详细介绍,不熟悉的可以回顾一下:

  代码如下:

  from selenium import webdriver

from selenium.webdriver.common.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():

browser.get('https://www.itjuzi.com/user/login')

input = wait.until(EC.presence_of_element_located(

(By.XPATH, '//*[@id="create_account_email"]')))

input.send_keys('irw27812@awsoo.com')

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(

(By.XPATH, '//*[@id="login_btn"]')))

submit.click() # 点击登录按钮

get_page_index()

def get_page_index():

browser.get('http://radar.itjuzi.com/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.摘要:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线