scrapy使用selenium模拟登录知乎

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登录淘宝,但登录淘宝代码增加了反爬虫已经不能使用了。

你可能感兴趣的:(scrapy使用selenium模拟登录知乎)