如何使用requests库从受密码保护的网站获取数据?
解决密码保护网站的Python监控脚本问题
嘿,作为兼职自由编辑遇到公司通知系统掉链子这种事真的太糟心了!别担心,我来帮你一步步搞定这个Python脚本——从登录密码保护网站,到定时监控内容变化,再到发送邮件提醒,全给你安排明白,而且都是新手友好的步骤~
第一步:搞定密码保护网站的登录
这是你当前遇到的核心问题,网站的密码验证通常分两种情况,我都给你写好示例:
情况1:HTTP基本认证(比较少见,但简单)
有些网站用的是最基础的HTTP账号密码弹窗,直接用requests的auth参数就能搞定:
import requests # 替换成你的账号密码和目标网站URL auth = ('你的用户名', '你的密码') response = requests.get('https://目标网站的监控页面URL', auth=auth) # 验证是否登录成功:打印页面前100个字符看看 print(response.text[:100])
情况2:表单登录(绝大多数网站用这个)
大部分网站是通过登录表单提交账号密码,这时候需要用requests.Session()来保持登录状态(相当于浏览器的Cookie),还要先获取登录页面的csrf令牌(很多网站用来防机器人):
- 先安装解析HTML的工具(用来提取csrf令牌):
pip install beautifulsoup4
- 登录代码示例:
import requests from bs4 import BeautifulSoup # 创建会话,保持登录状态 session = requests.Session() # 1. 先访问登录页面,拿到csrf令牌(如果网站有的话) login_page_url = 'https://目标网站的登录页面URL' login_page = session.get(login_page_url) soup = BeautifulSoup(login_page.text, 'html.parser') # 这里要根据实际网站的表单字段改!打开浏览器F12看登录表单的name属性 # 比如常见的csrf字段名是csrfmiddlewaretoken、csrf_token等 csrf_token = soup.find('input', {'name': 'csrfmiddlewaretoken'}).get('value') # 2. 构造登录提交的数据 login_data = { 'username': '你的用户名', 'password': '你的密码', 'csrfmiddlewaretoken': csrf_token # 如果网站没有csrf令牌就删掉这一行 } # 3. 提交登录请求,注意URL是表单的action属性值(看浏览器F12的网络请求) login_submit_url = 'https://目标网站的登录提交URL' login_response = session.post(login_submit_url, data=login_data) # 验证登录是否成功:找登录后页面的特征文本,比如"欢迎回来" if '欢迎回来' in login_response.text: print('登录成功!可以开始监控了') else: print('登录失败!检查账号密码,或者表单字段有没有写错')
第二步:定时拉取并检查内容变化
接下来要让脚本每隔一分钟跑一次,对比特定字段的变化。我们可以用time.sleep()来实现定时,同时保存上一次的内容做对比:
import time # 初始化上一次的监控内容,第一次运行时为空 last_monitored_content = None while True: try: # 用之前的session请求监控页面(保持登录状态) target_page = session.get('https://目标网站的监控页面URL') soup = BeautifulSoup(target_page.text, 'html.parser') # 提取你要监控的特定字段!这里要根据网站结构改 # 比如监控工作列表的数量,或者某个显示未读工作的文本 current_content = soup.find('div', {'class': 'job-count'}).text.strip() # 对比内容变化 if last_monitored_content is None: # 第一次运行,记录初始内容 last_monitored_content = current_content print(f'初始化监控:当前内容是 {current_content}') else: if current_content != last_monitored_content: print('⚠️ 内容有变化!新的工作机会来了!') # 这里调用邮件提醒函数(下面会写) send_email_alert() # 更新记录的内容 last_monitored_content = current_content else: print('内容无变化,继续监控...') # 每隔一分钟跑一次 time.sleep(60) # 处理网络错误等异常,避免脚本直接崩溃 except Exception as e: print(f'请求出错了:{str(e)},2分钟后重试') time.sleep(120)
第三步:发送邮件提醒
最后加上邮件提醒功能,用Python自带的smtplib就行,以QQ邮箱为例(其他邮箱比如Gmail、163配置类似,查一下对应的SMTP服务器和端口):
import smtplib from email.mime.text import MIMEText from email.header import Header def send_email_alert(): # 替换成你的邮箱信息 sender_email = '你的邮箱@qq.com' receiver_email = '你的专用提醒账户@xxx.com' # 注意:这里不是邮箱登录密码,是邮箱的SMTP授权码!去邮箱设置里开启SMTP获取 email_password = '你的SMTP授权码' # 邮件内容 mail_content = '目标网站的工作内容有更新啦!快上去看看有没有新机会~' message = MIMEText(mail_content, 'plain', 'utf-8') message['From'] = Header('工作监控脚本', 'utf-8') message['To'] = Header('提醒账户', 'utf-8') message['Subject'] = Header('💼 新工作机会提醒', 'utf-8') try: # 连接QQ邮箱的SMTP服务器(SSL加密) smtp_server = smtplib.SMTP_SSL('smtp.qq.com', 465) smtp_server.login(sender_email, email_password) smtp_server.sendmail(sender_email, receiver_email, message.as_string()) smtp_server.quit() print('邮件提醒发送成功!') except smtplib.SMTPException as e: print(f'发送邮件失败:{str(e)}')
新手友好提示
- 安装所有需要的库:
pip install requests beautifulsoup4 - 调试的时候把
time.sleep(60)改成time.sleep(5),这样不用等一分钟就能看到效果,正式运行再改回来 - 不要把用户名密码硬编码在脚本里!可以写个
config.py文件,用import config来引用,或者用环境变量,更安全 - 用浏览器F12的「网络」标签,查看登录时的请求参数,这是搞定表单登录的关键——每个网站的表单字段可能不一样,一定要自己核对
慢慢来,第一次写Python脚本遇到问题很正常,先把登录部分跑通,再一步步加定时和邮件功能,祝你能抢到更多工作机会!
内容的提问来源于stack exchange,提问作者Plesbien
相关产品推荐
相关产品推荐

