Python 网络爬虫实战:模拟登录并爬取数据的完整流程

2023-04-17 00:00:00 爬虫 实战 流程

一、目标网站分析

我们选取一个简单的示例网站进行操作,网址为 http://www.pidancode.com。该网站需要登录才能爬取相关信息,因此我们需要进行模拟登录,并获取目标数据。

二、登录网站

  1. 访问登录页面

我们首先需要访问登录页面,获取登录所需的表单数据。可以使用 requests 库中的 get() 函数来实现。

import requests

login_url = 'http://www.pidancode.com/login'
response = requests.get(login_url)
  1. 解析页面信息

得到登录页面的 HTML 代码后,我们需要将其解析出需要的表单数据。一般来说,登录表单中包含用户名、密码、验证码等信息,其中用户名和密码是必填项。我们可以使用 Beautiful Soup 库来解析 HTML 代码并提取相关表单信息。

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, 'html.parser')
form = soup.find('form', {'class': 'form-signin'})

inputs = form.find_all('input')

data = {}

for i in inputs:
    if i.has_attr('value'):
        data[i['name']] = i['value']
    elif i.has_attr('type') and i['type'] == 'hidden':
        data[i['name']] = ''

这段代码中,我们首先使用 BeautifulSoup 库对 HTML 代码进行解析。然后,我们找到登录表单,通过遍历表单中的 input 标签,将其 name 属性作为 key,将其 value 属性作为 value,保存到 data 字典中。

  1. 添加登录信息

通过查看网页源代码,我们可以发现登录表单的提交地址为 http://www.pidancode.com/login/checklogin。因此,我们需要在 data 中添加登录信息,即用户名和密码。这里我们使用硬编码的方式来添加登录信息,实际使用时可以通过读取配置文件来实现。

data['login_name'] = 'your_username'
data['login_pass'] = 'your_password'
  1. 模拟登录

有了表单数据和登录信息,我们就可以使用 requests 库中的 post() 函数来模拟登录了。

login_url = 'http://www.pidancode.com/login/checklogin'
response = requests.post(login_url, data=data)

此时,response 中包含了模拟登录后返回的页面信息。如果登录成功,我们需要检查 response 中是否包含已登录用户的信息,以确保登录操作成功。

if 'your_username' in response.text:
    print('Login Success!')
else:
    print('Login Failed!')

三、获取目标数据

  1. 访问目标页面

登录成功后,我们就可以通过访问相关页面来获取目标数据了。同样是使用 requests 库中的 get() 函数。

target_url = 'http://www.pidancode.com/users/me'
response = requests.get(target_url)
  1. 解析页面信息

我们使用 BeautifulSoup 库解析页面信息。在获取目标数据之前,需要查看页面代码并确定数据所在的标签。这里假设我们要获取用户名。

soup = BeautifulSoup(response.text, 'html.parser')
name_tag = soup.find('div', {'class': 'name'})
name = name_tag.string

这段代码中,我们使用 find() 方法查找页面中 class 为 name 的 div 标签。然后,我们使用 string 属性获取标签中的文本信息,即用户名。

四、完整代码

import requests
from bs4 import BeautifulSoup

# 登录页面
login_url = 'http://www.pidancode.com/login'
# 登录地址
check_url = 'http://www.pidancode.com/login/checklogin'
# 目标页面
target_url = 'http://www.pidancode.com/users/me'

# 获取登录页面
response = requests.get(login_url)

# 解析登录页面信息
soup = BeautifulSoup(response.text, 'html.parser')
form = soup.find('form', {'class': 'form-signin'})
inputs = form.find_all('input')
data = {}
for i in inputs:
    if i.has_attr('value'):
        data[i['name']] = i['value']
    elif i.has_attr('type') and i['type'] == 'hidden':
        data[i['name']] = ''

# 添加登录信息
data['login_name'] = 'your_username'
data['login_pass'] = 'your_password'

# 模拟登录
response = requests.post(check_url, data=data)

# 检查登录结果
if 'your_username' in response.text:
    print('Login Success!')
else:
    print('Login Failed!')

# 访问目标页面
response = requests.get(target_url)

# 解析目标页面信息
soup = BeautifulSoup(response.text, 'html.parser')
name_tag = soup.find('div', {'class': 'name'})
name = name_tag.string

print('Hello, %s!' % name)

在实际使用中,需要根据目标网站的具体情况进行修改,并根据需求进行数据抽取和处理。

相关文章