scrapy使用selenium模拟登录知乎
项目的spider 中
class zhihuSpider(scrapy.Spider):
name = 'zhihu2'
allowed_domains = ['www.zhihu.com/']
start_urls = ['https://www.zhihu.com/signin','https://www.zhihu.com/people/sun-lu-66-67' ]
def __init__(self, *args, **kwargs): # 初始化
self.browser = None
self.cookies = None
super(zhihuSpider, self).__init__(*args, **kwargs) # 这里是关键
def parse(self, response):
# 打印链接,打印网页源代码
print(response.url)
print(response.body.decode("utf-8", "ignore"))
项目的middlewares.py 中:
1 spider.browser.page_source 获取响应的源代码
2 session.get(request.url).text 获取响应的源代码
3 requests采用session管理cookie
4 urllib 采用cookieJar管理cookie
class LoginMiddleware(object):
'''
找到password username输入框并send_keys
点击登录并抓取cookie,spider.browser.get_cookies()
返回页面信息,HtmlResponse
'''
def process_request(self, request, spider):
if spider.name == "zhihu2": # 指定仅仅处理这个名称的爬虫
if request.url.find("signin") != -1: # 判断是否登陆页面
mobilesetting = {"deviceName": "iPhone 6 Plus"}
options = webdriver.ChromeOptions() # 浏览器选项
options.add_experimental_option("mobileEmulation", mobilesetting) # 模拟手机
spider.browser = webdriver.Chrome("D://360Downloads//Software//chromedriver.exe",chrome_options=options) # 创建一个浏览器对象
spider.browser.set_window_size(400, 800) # 配置手机大小
spider.browser.get(request.url) # 爬虫访问链接
time.sleep(3) # 必须要睡下因为考虑到输入:用户名密码 要时间
print("login访问", request.url)
ps_login=spider.browser.find_element_by_xpath('//*[@id="root"]/div/main/div/div[2]/div/button')
ps_login.click()
username = spider.browser.find_element_by_xpath('//input[@name="username"]')
password = spider.browser.find_element_by_xpath('//input[@name="password"]')
time.sleep(1)
username.send_keys("XXX") # 账户
time.sleep(2)
password.send_keys("XXX") # 密码
time.sleep(2)
spider.browser.find_element_by_xpath('//button[@type="submit"]').click()
time.sleep(4)
spider.cookies = spider.browser.get_cookies() # 抓取全部的cookie
# spider.browser.close()
return HtmlResponse(url=spider.browser.current_url, # 当前连接
body=spider.browser.page_source, # 源代码
encoding="utf-8") # 返回页面信息
else: # 登录后则执行
'''
1 采用requests.session保存cookie
2 设置cookie session.cookie.set(name,value)
3 清空headers session.headers.clear()
4 发起get请求 session.get(url)
'''
print("request 访问")
session = requests.session() # 会话
for cookie in spider.cookies:
session.cookies.set(cookie['name'], cookie["value"])
session.headers.clear() # 清空头
newpage = session.get(request.url)
print("---------------------")
print(request.url)
print("---------------------")
# print(newpage.text)
# print("---------------------")
# 页面
time.sleep(3)
return HtmlResponse(url=request.url, # 当前连接
body=newpage.text, # 源代码
encoding="utf-8") # 返回页面信息
本文的代码会在下篇的scrapy模拟登录知乎并获取知乎用户的信息https://blog.csdn.net/huangwencai123/article/details/89598669中给出。
本文大部分参考了https://www.e-learn.cn/content/python/907669登录淘宝,但登录淘宝代码增加了反爬虫已经不能使用了。