前言:

在慕课上买了个付费视频,里面有一章是讲用CrawlSpider来爬取拉勾网,可能因为视频录的时候比较早,老师没加headers,也没用cookie所有的拉勾的工作的详情页面就全部200了,但是自己动手的时候,怎么都是302,去网上查了查,说是加上cookie和headers就可以了,自己动手试了试还真是成功了,拿出来和大家分享一下

1.Selenium获得登陆的cookie:

    首先第一步是要拿到cookie,这里采用selenium模拟登陆浏览器的方法,简单粗暴,就是调试的时候比较慢。直接上源码了,没啥好理解的:

#-*- coding:utf-8 -*-
__author__ = 'GaoShuai'from selenium import webdriver
from scrapy.selector import Selector
import timedef login_lagou():browser = webdriver.Chrome(executable_path="D:/chromedriver.exe")browser.get("https://passport.lagou.com/login/login.html")# 填充账号密码browser\.find_element_by_css_selector("body > section > div.left_area.fl > div:nth-child(2) > form > div:nth-child(1) > input")\.send_keys("username")browser\.find_element_by_css_selector("body > section > div.left_area.fl > div:nth-child(2) > form > div:nth-child(2) > input")\.send_keys("password")# 点击登陆按钮browser\.find_element_by_css_selector("body > section > div.left_area.fl > div:nth-child(2) > form > div.input_item.btn_group.clearfix > input")\.click()cookie_dict={}time.sleep(3)Cookies = browser.get_cookies()for cookie in Cookies:cookie_dict[cookie['name']] = cookie['value']# browser.quit()return cookie_dictdef login_zhihu():browser = webdriver.Chrome(executable_path="D:/chromedriver.exe")browser.get("https://www.zhihu.com/signup?next=%2F")# 填充账号密码browser \.find_element_by_css_selector(".SignFlow-accountInput.Input-wrapper input") \.send_keys("username")browser \.find_element_by_css_selector(".SignFlow-passwordInput.Input-wrapper input") \.send_keys("password")# 点击登陆按钮browser \.find_element_by_css_selector("#root > div > main > div > div > div > div.SignContainer-inner > div.Login-content > form > button") \.click()cookie_dict = {}time.sleep(3)Cookies = browser.get_cookies()for cookie in Cookies:cookie_dict[cookie['name']] = cookie['value']# browser.quit()return cookie_dict
if __name__=="__main__":# login_lagou()print (login_zhihu())

2.将cookie加到所有的请求中:

虽然用selenium拿到了cookie,但是自己调试了一下发现,只有请求 start_urls中的url才会带上,使用rule从response里拿到的其他url,再请求时还是没有cookie,被重定向是肯定的了。下面我简单的分析下源码,欢迎各位指正:

class CrawlSpider(Spider):

大家打开CrawlSpider可以发现这个类继承了Spider,我是看教学视频知道的,Spider这个类开始第一个请求是函数:

start_requests(self)

这个方法里面有个if else但是都是yield了一个Request对象,这里要注意一下,这个Request类是scrapy.http.Request,在scrapy.http.Request类的初始化方法里面有一句话:

self.cookies = cookies or {}

这句话会把你构建请求时候传递的参数赋过去,但是start_requests方法并没有给具体的赋值,因此我就尝试着自己重写了start_requests方法,在构建第一个请求的时候,将cookie传递过去

def start_requests(self):
        self.cookies = selenium_login.login_lagou()
        print (type(self.cookies))
        print(self.headers)
        yield Request(url=self.start_urls[0],
                             cookies=self.cookies,
                             headers=self.headers,
                             callback=self.parse,
                             dont_filter=True)

到此为止,爬虫的第一个请求已经有了cookie了。

咱们继续上面的源码说,当你新建一个Spider爬虫时(并不是CrawlSpider)时,模版会自动声明一个parse函数,在这个函数里面可以定制自己的处理规则,但是你要在yield Request对象时自己来指定回调函数,即callback参数。

去翻翻CrawlSpider的源码,发现CrawlSpider已经把Spider类的parse方法给重写了。    重写后,直接返回了一个方法:

def parse(self, response):

        return self._parse_response(response, self.parse_start_url, cb_kwargs={}, follow=True)

     def _parse_response(self, response, callback, cb_kwargs, follow=True):
        if callback:
            cb_res = callback(response, **cb_kwargs) or ()
            cb_res = self.process_results(response, cb_res)
            for requests_or_item in iterate_spider_output(cb_res):
                yield requests_or_item

if follow and self._follow_links:
            for request_or_item in self._requests_to_follow(response):

                yield request_or_item

大家可以先看下这个方法的定义,第三个参数是回调函数,就是将self.parse_start_url这个方法作为回调函数,然而这个parse_start_url方法什么都没做。我猜测这里是CrawlSpider留给大家来定制自己对第一个response的解析需求的只是我的猜测而已。

到这里我就直接把第一个请求的回调设置成了parse

之后这个函数中还调用了一个_requests_to_follow方法,这个方法会使用Rules定制的规则来从response中获得需要再次请求的url,需要解析response的Rules记得要将follow参数设置为true。

拿到了URL后,我们需要再次构造请求,

def _requests_to_follow(self, response):
        if not isinstance(response, HtmlResponse):
            return
        seen = set()
        for n, rule in enumerate(self._rules):
            links = [lnk for lnk in rule.link_extractor.extract_links(response)
                     if lnk not in seen]
            if links and rule.process_links:
                links = rule.process_links(links)
            for link in links:
                seen.add(link)
                r = self._build_request(n, link)
                yield rule.process_request(r)

这里我们可以看到_requests_to_follow方法,会用Rules中定制的规则来获得需要再次请求的url,url会放到一个set中来去重,至于请求详细怎么构成的,就要看那个for循环里的_build_request方法了,

def _build_request(self, rule, link):
        r = Request(url=link.url, callback=self._response_downloaded)
        r.meta.update(rule=rule, link_text=link.text)

        return r

这里我们可以看到,这里构造请求,但是这里只传递一个url和一个callback,想想自己需要第一次请求之后的请求都要带上cookie,我就尝试自己重写了这个方法:

def _build_request(self, rule, link):r = Request(url=link.url,headers=self.headers,cookies=self.cookies, callback=self._response_downloaded)r.meta.update(rule=rule, link_text=link.text)return r

给它加上了cookie和headers。

到此重定向的问题就被解决了。

但是我觉得一定还会有更简单的方法可以解决这个问题,希望大神指正。

CrawlSpider爬取拉勾网,解决302问题。相关推荐

  1. python成功爬取拉勾网——初识反爬(一个小白真实的爬取路程,内容有点小多)

    python成功爬取拉勾网(一个小白的心里路程) 最开始想爬取拉钩是因为半年前上python实验课的时候,老师给了两个任务,一个时爬取糗百的笑话内容,另一个时爬取拉勾网的职位信息,当时因为课时紧张的缘 ...

  2. Python搭建代理池爬取拉勾网招聘信息

    先来看一张图了解下爬虫 实现功能 多线程爬取拉勾网招聘信息 维护代理 ip 池 搭建 node 服务器 Taro 使用 echarts 做数据分析 1.多线程爬取拉勾网招聘信息 Tip:涉及知识 1. ...

  3. 爬虫实战之全站爬取拉勾网职位信息

    全站爬取拉勾网职位信息 一.环境 window7 scrapy MySQL 二.简介 scrapy的全站爬取方式crawlspider跟其通用爬取方式spider实现上有一定的区别,两者都有各自的优势 ...

  4. 什么你还不知道招聘信息,小唐来教你——最新2021爬取拉勾网招聘信息(一)

    文章目录 前言 一.准备我们的库 二.分析分析 三. 代码 四.数据展示 小唐的心路历程 上一篇:没有啦! 下一篇:什么你还不知道招聘信息,小唐来教你--最新2021爬取拉勾网招聘信息(二) 前言 有 ...

  5. scrapy 爬取拉勾网职位信息

    需求:1.使用python爬虫框架,爬取拉勾网职位信息, 2.将爬取的职位信息存储到json格式的文件中 3.将爬取的数据进行数据分析 1.图片中的链接是职位列表页的链接,进行翻页,该链接没有变化,无 ...

  6. node 爬虫 实战 - 爬取拉勾网职位数据

    node 爬虫 实战 - 爬取拉勾网职位数据,主要想把数据用于大数据学习,到时候大数据分析可以自己分析一下职位的情况,和比较一些我现在的职位在深圳乃至全国的开发人员水平. 涉及到的技术栈:node.j ...

  7. selenium爬取拉勾网

    文章目录 1 安装selenium和webdriver 1.1 自动控制浏览器 2 正式爬取拉勾网 2.1控制浏览器,进入拉勾网 2.2爬取所需内容 2.2.1解析提取信息 2.2.2 翻页爬取 3 ...

  8. python爬取拉勾网给定关键词职位信息存入数据库_Python 爬取拉勾网python职位信息...

    今天的任务是爬取拉勾网的职位信息. 首先,我们进入拉勾网,然后在职位搜索栏搜索Python 的同时,打开控制面板F12,来查看网页构成. 在XHR里,可以清楚的看见Ajax请求,所以需要使用sessi ...

  9. java爬虫拉勾网_[Java教程]node.js爬虫爬取拉勾网职位信息

    [Java教程]node.js爬虫爬取拉勾网职位信息 0 2017-03-14 00:00:21 简介 用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京.上海.广州.深圳 ...

最新文章

  1. Python迁移MySQL数据到MongoDB脚本
  2. java网格式布局登录界面_Java学习笔记------自己书写的登录界面实例
  3. 2021考研数一李正元400题、张宇4套卷题目整理
  4. java设计模式-Builder创建者模式
  5. 程序集强命名与GAC
  6. python如何使用多线程_python多线程应用中的详细介绍
  7. java中怎么用代码打出ASCII码字符_JAVA实现打印ascii码表代码
  8. Random Forest算法参数解释及调优
  9. 计算机电缆 耐火,耐火计算机电缆ZR-NH-DJVVP
  10. Mongo DB命令简介
  11. 成都睿铂 | 云南省地矿测绘院1:500地形免像控项目分享
  12. 男生看女生叫审美,女生看男生叫好色之新解
  13. oracle odbc驱动 linux,linux下oracle的odbc驱动的安装与配置
  14. 领秀加速器软件介绍及功能介绍
  15. 港澳台手机号正则表达式
  16. 【qq视频录像机软件2013V3.0】聊天视频网络电视录像专家
  17. [转]论window和Linux之长短
  18. Redis:配置文件
  19. 计算机文字转表格,Word怎么把文字转换成表格 30秒搞定
  20. 音频视频播放无法拖动快进

热门文章

  1. golang data race 竞态条件
  2. Bootstrap重抽样方法
  3. 炫龙P6笔记本搭建Windows 10+Ubuntu双系统
  4. 手把手教你用Python爬中国电影票房数据
  5. 一个完整小巧的Redux全家桶项目
  6. 浙江大学计算机研究生2020年录取分数线,2020年浙江大学考研分数线公布
  7. linux怎么配置网卡实训报告,网络配置实验心得5
  8. 单行函数和多表查询 例题代码可复制
  9. asp.net(c#)如何把字符串转换成数组
  10. python mysql日期输出格式_Python/Shell/MySQL时间获取与格式转换