网站首页 > 开源技术 正文
你是否遇到过这样的问题?想用爬虫抓取某网站的数据,却发现内容必须登录才能查看。直接访问只会跳转到登录页,手动复制粘贴又太麻烦……
别担心!今天教你一种方法,用 Python 轻松突破登录限制,抓取目标数据!无论你是数据分析师、开发者还是技术爱好者,这篇干货都能让你事半功倍!
前一篇文章中,我们学习了 requests 库和 BeautifulSoup 库的用法,通过实战获取豆瓣 Top250 电影数据并保存为结构化的 CSV 文件。本文将为大家介绍如何借助 requests 库的 Session 机制,来实现模拟登录 GitHub 网站,并获取个人详情信息。
1. 自动管理 Cookies
2. 连接池与 Keep-Alive
3. 持久化请求头与参数
import requests
class Login(object):
def __init__(self):
self.headers = {
'Referer': 'https://gibhub.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36'
}
self.login_url = 'https://github.com/login'
self.post_url = 'https://github.com/session'
self.logined_url = 'https://github.com/settings/profile'
self.session = requests.Session()
# 获取 authenticity_token
def token(self):
response = self.session.get(self.login_url, headers=self.headers)
selector = etree.HTML(response.text)
token = selector.xpath('//div//input[2]/@value')
return token
# 开始模拟登录
def login(self, login_name, password):
post_data = {
'commit': 'Sign in',
'authenticity_token': self.token()[0],
'login': login_name,
'password': password
}
response = self.session.post(self.post_url, data=post_data, headers=self.headers)
if response.status_code == 200:
# 登录成功后,获取我的个人信息
response = self.session.get(self.logined_url, headers=self.headers)
if response.status_code == 200:
self.profile(response.text)
# 获取个人信息:姓名、邮箱
def profile(self, html):
selector = etree.HTML(html)
name = selector.xpath('//input[@id="user_profile_name"]/@value')[0]
email = selector.xpath('//select[@id="user_profile_email"]/option[@value!=""]/text()')[0]
print('Name:', name)
print('Email:', email)
import requests
from lxml import etree
class Login(object):
def __init__(self):
self.headers = {
'Referer': 'https://gibhub.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36'
}
self.login_url = 'https://github.com/login'
self.post_url = 'https://github.com/session'
self.logined_url = 'https://github.com/settings/profile'
self.session = requests.Session()
# 获取 authenticity_token
def token(self):
response = self.session.get(self.login_url, headers=self.headers)
# 解析 HTML
selector = etree.HTML(response.text)
# 获取 authenticity_token 的值
token = selector.xpath('//input[@name="authenticity_token"]/@value')
return token
# 开始模拟登录
def login(self, login_name, password):
post_data = {
'commit': 'Sign in',
'authenticity_token': self.token()[0],
'login': login_name,
'password': password
}
response = self.session.post(self.post_url, data=post_data, headers=self.headers)
if response.status_code == 200:
# 登录成功后,获取我的个人信息
response = self.session.get(self.logined_url, headers=self.headers)
if response.status_code == 200:
self.profile(response.text)
def profile(self, html):
selector = etree.HTML(html)
name = selector.xpath('//input[@id="user_profile_name"]/@value')[0]
email = selector.xpath('//select[@id="user_profile_email"]/option[@value!=""]/text()')[0]
print('Name:', name)
print('Email:', email)
if __name__ == "__main__":
login = Login()
login.login(login_name='idroidr', password='123456')
Name: 梦想
Email: idroidr@163.com
有很多网站在登录时,还需要输入验证码,验证码是网站防止自动化登录的常见手段。 在 Python 爬虫开发中,处理验证码是一个常见而又具有挑战性的问题。验证码通常分为两大类:图形验证码(如图片中的文字或图案)和动态验证码(如滑动验证或点击验证)。下面我将分别介绍如何处理这两种类型的验证码。
4.1 图形验证码
图形验证码通常包含文本、数字或图片,需要识别后输入。处理这类验证码的常见方法有:
(1)手动输入验证码
示例代码如下:
import requests
from PIL import Image
from io import BytesIO
# 获取验证码图片
captcha_url = 'https://example.com/captcha'
response = session.get(captcha_url)
# 显示验证码图片
image = Image.open(BytesIO(response.content))
image.show()
# 手动输入验证码
captcha_code = input("请输入验证码:")
# 将验证码发送至登录请求中
payload = {
'username': 'your_username',
'password': 'your_password',
'captcha': captcha_code
}
login_response = session.post(login_url, data=payload)
(2) 使用 Tesseract OCR 库或其他库来识别图片中的文字。
import requests
from PIL import Image
import pytesseract
from io import BytesIO
session = requests.Session()
# 获取验证码图片
captcha_url = 'https://example.com/captcha'
response = session.get(captcha_url)
image = Image.open(BytesIO(response.content))
image.save('captcha.png')
# 使用Tesseract识别验证码
captcha_text = pytesseract.image_to_string(image).strip()
print("识别的验证码:", captcha_text)
# 准备登录数据
login_data = {
'username': 'your_username',
'password': 'your_password',
'captcha': captcha_text
}
# 提交登录
response = session.post('https://example.com/login', data=login_data)
if '欢迎' in response.text:
print("登录成功!")
else:
print("登录失败!")
import requests
from PIL import Image
from io import BytesIO
CHAOJIYING_USERNAME = 'your_username'
CHAOJIYING_PASSWORD = 'your_password'
CHAOJIYING_SOFT_ID = 'your_softid'
CHAOJIYING_KIND = '1004' # 验证码类型
session = requests.Session()
# 获取验证码图片
captcha_url = 'https://example.com/captcha'
response = session.get(captcha_url)
image = Image.open(BytesIO(response.content))
image.save('captcha.png')
# 使用超级鹰识别验证码
def chaojiying_post(pic):
url = 'http://upload.chaojiying.net/Upload/Processing.php'
files = {'userfile': ('captcha.png', pic, 'image/png')}
data = {
'user': CHAOJIYING_USERNAME,
'pass': CHAOJIYING_PASSWORD,
'softid': CHAOJIYING_SOFT_ID,
'codetype': CHAOJIYING_KIND
}
result = requests.post(url, data=data, files=files).json()
return result.get('pic_str')
with open('captcha.png', 'rb') as f:
captcha_text = chaojiying_post(f.read())
print("识别的验证码:", captcha_text)
# 准备登录数据
login_data = {
'username': 'your_username',
'password': 'your_password',
'captcha': captcha_text
}
# 提交登录
response = session.post('https://example.com/login', data=login_data)
if '欢迎' in response.text:
print("登录成功!")
else:
print("登录失败!")
4.2 动态验证码(如滑动验证)
动态验证码通常需要模拟用户的交互行为,例如滑动、点击等。这类验证码可以使用 Selenium 库来模拟浏览器行为。
使用 Selenium 之前必须先安装:
pip install selenium
示例代码(以滑动验证码为例):
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
# 初始化WebDriver
driver = webdriver.Chrome(executable_path='path/to/chromedriver')
# 打开目标网页
driver.get('https://example.com/captcha-page')
# 等待滑块元素加载完成
slider = driver.find_element_by_id('slider') # 根据实际情况修改选择器
track = driver.find_element_by_id('track') # 根据实际情况修改选择器
gap = driver.find_element_by_id('gap') # 根据实际情况修改选择器
# 计算滑动距离(根据实际情况可能需要调整)
slider_width = slider.size['width']
track_width = track.size['width'] - slider_width
gap_x = gap.location['x'] + (gap.size['width'] / 2) - (slider_width / 2)
distance = gap_x / (track_width / 100) # 转换为百分比距离
# 模拟滑动操作
ActionChains(driver).click_and_hold(slider).move_by_offset(distance, 0).release().perform()
# 等待验证完成(根据实际情况可能需要调整)
time.sleep(2)
# 关闭浏览器
driver.quit()
短信验证码一般需要将验证码发送至手机。处理此类验证码通常涉及手动输入验证码或配合自动化服务。如果要完成这种任务,通常需要爬虫脚本暂停执行,等待用户手动输入验证码,输入后继续进行登录。
下篇预告:下篇我们将学习如何爬取动态网页,并结合实例代码演示。
感谢你的阅读!如果觉得这篇文章有帮助,欢迎点赞或分享给更多想学 Python 的朋友。我们下次见!
猜你喜欢
- 2025-07-07 python遍历安居客网站的图片(python爬取安居客房源信息)
- 2025-07-07 Python + Flet 开发网站的最佳数据库模块组合
- 2025-07-07 一篇文章教你掌握使用Python和Sanic使代码快速异步
- 2025-07-07 学习python必须知道的几个网站(上)
- 2025-07-07 python 一条命令建立一个静态网站
- 2025-07-07 使用Python实现网页账户的自动登录操作
- 2025-07-07 如何使用python解决网站的反爬虫?
- 2025-07-07 8个python自学网站,一周就可以练熟Python,真的是是小白的福音
- 2025-07-07 如何用Python搭建自己的网站(python搭建个人网站)
- 2025-07-07 Python进阶-day 26:自动化脚本 - 使用 Selenium 实现网页搜索
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)