在网络数据获取的领域中,爬虫是一种强大的工具。今天我们将通过一个实际的例子 —— 登录古诗文网并获取相关页面数据,来学习基础的爬虫知识。
一、准备工作
在开始编写爬虫代码之前,我们需要安装一些必要的 Python 库。本次实战主要用到requests
库来发送 HTTP 请求,BeautifulSoup
库来解析 HTML 页面。
pip install requests beautifulsoup4
二、分析登录页面
我们的目标是登录古诗文网(登录古诗文网),在开始编写代码之前,需要先分析一下登录页面的结构。
- URL 地址:登录页面的 URL 为
https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx
,from
参数指定了登录成功后跳转的页面。 - 请求头(Headers):为了模拟浏览器请求,我们需要设置
User-Agent
,它是一个特殊的字符串,用于标识浏览器的类型和版本等信息。
import requests
# 这是登录页面的url地址
url = "https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36"
}
三、获取页面源码
使用requests
库的get
方法发送 HTTP GET 请求,获取登录页面的源码。
# 获取页面的源码
response = requests.get(url=url, headers=headers)
content = response.text
四、解析页面源码
我们使用BeautifulSoup
库来解析获取到的 HTML 页面,提取出我们需要的信息,比如隐藏域__VIEWSTATE
和__VIEWSTATEGENERATOR
的值,以及验证码图片的链接。
from bs4 import BeautifulSoup
soup = BeautifulSoup(content, "lxml")
# 获取__VIEWSTATE
viewstate = soup.select("#__VIEWSTATE")[0].attrs.get("value")
# 获取__VIEWSTATEGENERATOR
viewstategenerator = soup.select("#__VIEWSTATEGENERATOR")[0].attrs.get("value")
# 获取验证码图片,也可以通过打码平台的代码来实现自动识别
code = soup.select("#imgCode")[0].attrs.get("src")
code_url = "https://so.gushiwen.cn" + code
五、获取验证码图片
获取到验证码图片的链接后,我们可以使用requests
库的session
对象来保持会话,下载验证码图片到本地。
# 使用session保持会话
session = requests.session()
# 验证码的url的内容
response_code = session.get(code_url)
# 注意此时要使用二进制数据 因为我们是在进行图片的下载
content_code = response_code.content
# wb的模式就是将二进制数据写入到文件
with open("code.jpg", "wb") as fp:
fp.write(content_code)
六、输入验证码并登录
下载验证码图片后,我们需要手动观察验证码并在控制台输入。然后构造登录所需的数据,使用requests
库的post
方法发送登录请求。
code_name = input("请输入你的验证码")
# 点击登录
url_post = "https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx"
data_post = {
"__VIEWSTATE": viewstate,
"__VIEWSTATEGENERATOR": viewstategenerator,
"from": "http://so.gushiwen.cn/user/collect.aspx",
"email": "969@qq.com",##替换你的邮箱
"pwd": "12345678",
"code": code_name,
"denglu": "登录",
}
response_post = session.post(
url=url, headers=headers, data=data_post
) # 持续使用同一个session
content_post = response_post.text
with open("gushiwen.html", "w", encoding=" utf-8") as fp:
fp.write(content_post)
七、遇到的难点
- 隐藏域:
__VIEWSTATE
和__VIEWSTATEGENERATOR
是页面中的隐藏域,它们的值在每次页面加载时都会变化。在登录请求中,必须包含正确的这些值,否则登录会失败。我们通过解析页面源码来获取这些值。 - 验证码:验证码是为了防止自动化程序恶意登录。在本次实战中,我们采用了手动输入验证码的方式。在实际应用中,可以使用打码平台的 API 来实现验证码的自动识别,以提高爬虫的自动化程度。
通过本次基础爬虫实战,我们学习了如何使用requests
和BeautifulSoup
库来实现登录操作并获取页面数据。希望这篇博客能对你有所帮助,让你对爬虫的基本原理和实现有更深入的理解。