Python 爬虫-如何抓取需要登录的网页
你是否遇到过这样的问题?想用爬虫抓取某网站的数据,却发现内容必须登录才能查看。直接访问只会跳转到登录页,手动复制粘贴又太麻烦……
别担心!今天教你一种方法,用 Python 轻松突破登录限制,抓取目标数据!无论你是数据分析师、开发者还是技术爱好者,这篇干货都能让你事半功倍!
前一篇文章中,我们学习了 requests 库和 BeautifulSoup 库的用法,通过实战获取豆瓣 Top250 电影数据并保存为结构化的 CSV 文件。本文将为大家介绍如何借助 requests 库的 Session 机制,来实现模拟登录 GitHub 网站,并获取个人详情信息。
1. 自动管理 Cookies
2. 连接池与 Keep-Alive
3. 持久化请求头与参数
import requestsclass 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_tokendef 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 requestsfrom lxml import etreeclass 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_tokendef token(self):response = self.session.get(self.login_url, headers=self.headers)# 解析 HTMLselector = 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 requestsfrom PIL import Imagefrom 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 requestsfrom PIL import Imageimport pytesseractfrom io import BytesIOsession = 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 requestsfrom PIL import Imagefrom io import BytesIOCHAOJIYING_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 webdriverfrom selenium.webdriver.common.action_chains import ActionChainsimport time# 初始化WebDriverdriver = 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_widthgap_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 的朋友。我们下次见!
相关文章
- Spring Boot中对接Twilio以实现发送验证码和验证短信码
- Spring Boot 3.5:这次更新让你连配置都不用写了,惊不惊喜?
- Spring Boot+Pinot实战:毫秒级实时竞价系统构建
- SpringBoot敏感配置项加密与解密实战
- SpringBoot 注解最全详解,建议收藏!
- Spring Boot 常用注解大全:从入门到进阶
- SpringBoot启动之谜:@SpringBootApplication如何让配置化繁为简
- Springboot集成Kafka原理_spring集成kafka的原理
- Spring Boot中@Data注解的深度解析与实战应用
- 大佬用1000字就把SpringBoot的配置文件讲的明明白白!
