Python 网络爬虫实战:模拟登录并爬取数据的完整流程
一、目标网站分析
我们选取一个简单的示例网站进行操作,网址为 http://www.pidancode.com。该网站需要登录才能爬取相关信息,因此我们需要进行模拟登录,并获取目标数据。
二、登录网站
- 访问登录页面
我们首先需要访问登录页面,获取登录所需的表单数据。可以使用 requests 库中的 get() 函数来实现。
import requests login_url = 'http://www.pidancode.com/login' response = requests.get(login_url)
- 解析页面信息
得到登录页面的 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 字典中。
- 添加登录信息
通过查看网页源代码,我们可以发现登录表单的提交地址为 http://www.pidancode.com/login/checklogin。因此,我们需要在 data 中添加登录信息,即用户名和密码。这里我们使用硬编码的方式来添加登录信息,实际使用时可以通过读取配置文件来实现。
data['login_name'] = 'your_username' data['login_pass'] = 'your_password'
- 模拟登录
有了表单数据和登录信息,我们就可以使用 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!')
三、获取目标数据
- 访问目标页面
登录成功后,我们就可以通过访问相关页面来获取目标数据了。同样是使用 requests 库中的 get() 函数。
target_url = 'http://www.pidancode.com/users/me' response = requests.get(target_url)
- 解析页面信息
我们使用 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)
在实际使用中,需要根据目标网站的具体情况进行修改,并根据需求进行数据抽取和处理。
相关文章