该文章仅供学习,如有错误,欢迎指出

1.开始创建一个项目

mkdir lagou

2.进入到文件夹下创建python3的虚拟环境

pipenv install scrapy

3.进入pipenv 下使用scrapy命令创建爬虫项目

pipenv shell
scrapy startproject lagou
cd lagou
scrapy genspider -o crawl test www.lagou.com

Scrapy 为我们提供了四种模板,根据不同的网页类型,我们可以选用不同的爬虫模板,这里我们使用的是crawl模板

class TestSpider(CrawlSpider):name = 'test'allowed_domains = ['https://www.lagou.com']start_urls = ['https://www.lagou.com/']rules = (Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),)def parse_item(self, response):i = {}#i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()#i['name'] = response.xpath('//div[@id="name"]').extract()#i['description'] = response.xpath('//div[@id="description"]').extract()return i#crawl模板代码

解释spider-crawl模板

class CrawlSpider(Spider):rules = ()def __init__(self, *a, **kw):super(CrawlSpider, self).__init__(*a, **kw)self._compile_rules()def parse(self, response):return self._parse_response(response, self.parse_start_url, cb_kwargs={}, follow=True)def parse_start_url(self, response):return []def process_results(self, response, results):return resultsdef _build_request(self, rule, link):r = Request(url=link.url, callback=self._response_downloaded)r.meta.update(rule=rule, link_text=link.text)return rdef _requests_to_follow(self, response):if not isinstance(response, HtmlResponse):returnseen = 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)def _response_downloaded(self, response):rule = self._rules[response.meta['rule']]return self._parse_response(response, rule.callback, rule.cb_kwargs, rule.follow)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_itemif follow and self._follow_links:for request_or_item in self._requests_to_follow(response):yield request_or_itemdef _compile_rules(self):def get_method(method):if callable(method):return methodelif isinstance(method, six.string_types):return getattr(self, method, None)self._rules = [copy.copy(r) for r in self.rules]for rule in self._rules:rule.callback = get_method(rule.callback)rule.process_links = get_method(rule.process_links)rule.process_request = get_method(rule.process_request)@classmethoddef from_crawler(cls, crawler, *args, **kwargs):spider = super(CrawlSpider, cls).from_crawler(crawler, *args, **kwargs)spider._follow_links = crawler.settings.getbool('CRAWLSPIDER_FOLLOW_LINKS', True)return spiderdef set_crawler(self, crawler):super(CrawlSpider, self).set_crawler(crawler)self._follow_links = crawler.settings.getbool('CRAWLSPIDER_FOLLOW_LINKS', True)

start_urls定义了初始爬取的网页地址
(一)使用parse_start_url去对start_urls作处理

    def parse_start_url(self, response):  return []
#源码里面返回一个空的列表,如果要运行爬虫,我们需要对他进行处理

(二)使用parse对parse_start_url解析后的response进行处理,并且把结果交给_parse_response方法
这里的self.parse_start_url, cb_kwargs={}都为回调函数,一个为开始的网址,一个用来收集rule下的callback函数

rules = (Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),)

Rule是CrawlSpider模板爬取内容的规则,如果Follow是False,那么爬虫只会爬取符合allow的网页。
而如果follows是True,那么爬虫会爬取start_urls的网页下的所有符合allow的网页连接
rule无论有无callback,都由同一个_parse_response函数处理,只不过他会判断是否有follow和callback
对Rule的解释在文章下面

    def parse(self, response):return self._parse_response(response, self.parse_start_url, cb_kwargs={}, follow=True)#

(三)判断接受的内容是否为回调函数(该回调函数可能是rule中的解析函数,也可能是 parse_start_url函数)
如果是parse_start_url的函数,则会交给process_results处理。返回cb_res的一个列表
使用iterate_spider_output对列表进行操作,返回item,如果选择了follows那么会把response下的url继续跟进

    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_itemif follow and self._follow_links:for request_or_item in self._requests_to_follow(response):yield request_or_item

(四)

    def _requests_to_follow(self, response):if not isinstance(response, HtmlResponse):returnseen = 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)

对Rule的解释

class Rule(object):def __init__(self, link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=identity):self.link_extractor = link_extractorself.callback = callbackself.cb_kwargs = cb_kwargs or {}self.process_links = process_linksself.process_request = process_requestif follow is None:self.follow = False if callback else Trueelse:self.follow = follow

对模板的理解有些不足,之后会慢慢补

2.简单爬虫————爬取拉勾网招聘信息(一)相关推荐

  1. Python爬虫实战之一 - 基于Requests爬取拉勾网招聘信息,并保存至本地csv文件

    Python爬虫实战之二 - 基于Requests抓取拉勾网招聘信息 ---------------readme--------------- 简介:本人产品汪一枚,Python自学数月,对于小白,本 ...

  2. 【python爬虫02】使用Scrapy框架爬取拉勾网招聘信息

    使用Scrapy框架爬取拉勾网招聘信息 最近接触了Scrapy爬虫框架,简单写了个爬虫爬取拉钩网的招聘信息,加深对Scrapy框架的理解,不得不说Scrapy框架其实还是蛮方便的,就像爬虫流水线一样, ...

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

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

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

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

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

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

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

    文章目录 前言 一.准备我们的库 二.数据清洗 三.核密度图及词云制作 四.完整代码 五.扩展 上一篇:什么你还不知道招聘信息,小唐来教你--最新2021爬取拉勾网招聘信息(一) 下一篇:没有拉! 前 ...

  7. 简单爬虫,爬取天猫商品信息

    前言 这是我第一次用Java来写爬虫项目,研究的也不是很透彻,所以爬虫技术的理论方面的就不说太多了. 主要还是以如何爬取商品信息为主,爬取最简单的商品信息,给出大概的思路和方法. 对于没有反爬技术的网 ...

  8. 什么样的人才能做互联网产品经理【爬取拉勾网招聘信息】

    分析目的 在这个校招如火如荼的季节,相信大家对各种招聘网站已经再熟(yan)悉(fan)不过了,各种java开发.算法.前端.后端岗位真的是琳琅满目,而我觉得其中与我的个人兴趣和专业匹配度最高的就是产 ...

  9. 爬取拉勾网招聘信息(招聘岗位,公司名称,薪资等)

    用爬虫框架进行爬取,框架还是feapder 代码如下: import feapder#轻量级爬虫 class LastAirSpider(feapder.AirSpider):def start_ca ...

最新文章

  1. 详解JavaScript数组(一)
  2. 我的世界光影mod怎么用_用“戏剧化”光影艺术 唤醒千年沉睡世界!
  3. hive(4)——元数据概述
  4. xdebug怎样在php中配置,教你在PHPStorm中配置Xdebug
  5. java 构造 statict_java学习:构造方法、static、final
  6. Mysql取分组中前N条记录
  7. lgb,xgb,gbdt,adb,RF区别与联系
  8. 极客c语言课程设计,c语言课程设计之实习报告共5天完整.doc
  9. 八数码问题的暴力求解
  10. ctrl z撤销后如何恢复_偏瘫后如何恢复?偏瘫家庭功能锻炼方法送给你
  11. 关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。...
  12. 产品经理必读书单(2019史上最全)
  13. bing 搜索引擎 无法访问 bug
  14. [I T]深圳唯冠与苹果达成和解协议后被指拖欠律师费遭起诉
  15. 文件及文件夹删除失败的解决方法
  16. 艾美捷-临床数量排名前20的药物靶点分析-磷酸二酯酶(PDEs)抗体
  17. html雪花飘落效果,使用js实现雪花飘落效果
  18. u盘误删的文件怎么找回?帮你轻松找回
  19. 手机内存跟电脑内存的区别
  20. ExecutorCompletionService

热门文章

  1. mysql 遍历 父子_mysql实现父子递归查询sql
  2. Java基础总结【狂神说】
  3. JPA使用@Modifying踩坑记录
  4. rapidjson Schema
  5. python注释以什么开始_python注释以什么符号开始
  6. 由git push -f引发的程序员枪击血案
  7. 只会用Excel吗?这套全面的数据分析工具打包送你
  8. svn revert详解
  9. 使用Zuul构建微服务网关(红莲业火)
  10. videojs简单使用