说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 的 requests 可以轻松访问公开的数据,但有些数据信息是需要登录才能访问,因此在爬取时要先进行登录,登录一般用以下代码:
# 常规登录方法
import requests
import json
# 构造头信息,如不要求json格式则去掉Content-Type信息及s.post中的json.dumps方法
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/323.234',
'Content-Type': 'application/json;charset=UTF-8'}
s = requests.session()
# 用户名和密码
login_data = dict(userName='my_name', password='my_password')
# 登录
s.post('http://user.x.com/login', data=json.dumps(login_data), headers=headers)
# 接着用 s 访问内容
但网站为了提高安全性,都增加了如滑块形式的复杂验证码,这时候requests方法就很难解决,这时Selenium就可以出场了。
Selenium是一个Web自动化测试工具,可以直接运行在浏览器上, Selenium可以根据代码指令让浏览器自动加载页面,模拟登录、代替人工执行操作,特点是得到的这些页面源码是经过浏览器渲染之后的。它的安装配置可以通过盖若的selenium教程 查看方法。
接下来,我们使用它访问一个内部站点,填充用户ID的昵称信息。
from selenium import webdriver
from selenium.webdriver import FirefoxOptions
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
import pandas as pd
import time
USER='xxx'
PWD='****'
browser = webdriver.Chrome()
# 登录,会启动浏览器需要验证时,手动操作,操作完成后会自动继续爬取
browser.get('http://mgr.x.com')
browser.find_element_by_xpath('//input[@placeholder="请输入用户名"]').click()
browser.find_element_by_xpath('//input[@placeholder="请输入用户名"]').send_keys(USER)
browser.find_element_by_xpath('//input[@placeholder="请输入密码"]').click()
browser.find_element_by_xpath('//input[@placeholder="请输入密码"]').send_keys(PWD)
browser.find_element_by_xpath('//input[@placeholder="请输入密码"]').send_keys(Keys.RETURN)
# 测试访问
browser.get('https://mgr.x.com/customer.html?id=34646')
# 解析昵称信息
browser.page_source.split('nickname":"')[1].split('","')[0]
# 'Aimee'
# 构造爬虫函数,方便 pandas 调用
def get_nick_name(browser, uid):
try:
uid = int(uid)
browser.get(f'https://mgr.x.com/customer.html?id=={uid}')
time.sleep(3)
n = browser.page_source.split('nickname":"')[1].split('","')[0]
return n
except:
return 0
# 用户ID列表
'''
uid
3213
1232
1241
1414
1424
2134
4546
'''
# 读取用户列表,先复制上边的字符串数据再执行
df = pd.read_clipboard()
# 调用爬虫
b = browser
dc = df.assign(nick_name=df['uid'].apply(lambda x: get_nick_name(b, x)))
# 保存数据
dc.to_csv('包含昵称.csv')
访问时会启动浏览器,在登录环节需要验证码时,手动进行操作,操作完成后会自动继续爬取。这种访问可以解决验证码无法识别的问题,还能解决前后端架构的网站无渲染后数据的问题。
另外,完成了登录,selenium 访问会进行页面渲染,速度较慢,可以将登录认证信息传递给 requests,利用 requests 访问接口高效爬取网站数据:
import requests
s = requests.Session()
selenium_user_agent = browser.execute_script("return navigator.userAgent;")
s.headers.update({"user-agent": selenium_user_agent})
for cookie in browser.get_cookies():
s.cookies.set(cookie['name'], cookie['value'], domain=cookie['domain'])
# 发起访问请求
r = s.get(target_url)
# driver.delete_all_cookies()
(完)
更新时间:2021-04-26 10:41:59 标签:python 爬虫 登录