爬虫首先要明确自己要爬取的网站以及内容

进入拉勾网的网站
然后看看想要爬取什么内容
职位,薪资,城市,经验要求
学历要求,全职或者兼职
职位诱惑,职位描述
提取公司的名称 以及 在拉勾网的url等等

然后在navicat中设计表

我是在数据库article_spider中设计的表lagou_job

url varchar 300
url_object_id varchar 50(作为主键)
title varchar 100
salary varchar 20(薪资) (不确定有没有工资,所以可以是空值)
job_city varchar 10 (可以为空)
work_years varchar 100 (可以为空)
degree_need varchar 30 (可以为空)
job_type varchar 20 (可以为空)
publish_time varchar 20 可以想想怎么把varchar转换为datetime类型
tags varchar varchar 100 (可以为空)
job_advantage varchar 1000 (可以为空)
job_desc longtext
job_addr varchar 50 (可以为空) 具体工作地址
company_url varchar 300 (可以为空)
company_name varchar 100 (可以为空)
crawl_time datetime
crawl_update_time datetime (可以为空)

然后进入anaconda的命令行(这里采用别的也是一样)

scrapy genspider --list
可以看到有 crawl 模板
然后使用
scrapy genspider -t crawl lagou www.lagou.com

我们可以在目录下看到这个代码

import scrapy
class LagouSpider(CrawlSpider):name = 'lagou'allowed_domains = ['www.lagou.com']start_urls = ['http://www.lagou.com/']rules = (Rule(LinkExtractor(allow=("zhaopin/.*",)), follow=True),Rule(LinkExtractor(allow=("gongsi/\d+.html",)), follow=True),Rule(LinkExtractor(allow="jobs/\d+.html"), callback='parse_job', follow=True),
)

其中rules 中的规则是读取拉勾网的二级目录下的筛选模式,我们只设置最后一种可以写入我们的数据库

接下来我们就可以分析网站中我们想要提取的对象了

我们可以先使用scrapy shell 进行分析

顺便提一句,现在拉勾网需要验证user-agent和cookies才能进行查看(而不是说要登录才能查看)

在anaconda的命令行中使用命令

scrapy shell -s USER_AGENT="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36" https://www.lagou.com/jobs/4804175.html

进行分析

这里有一点,就是在shell中这样写

response.css(".position-label li::text").extract()

而在crawlspider中只需要写入(".position-label li::text"),后面不需要加入extract()

这样子就可以爬取到我们想要的数据...

把数据输入到mysql数据库中

在items中进行定义

def remove_splash(value):#去掉工作城市的斜线return value.replace("/","")
def handle_jobaddr(value):addr_list = value.split("\n")addr_list = [item.strip() for item in addr_listif item.strip()!="查看地图"]return "".join(addr_list)
#self["front_image_path"], front_image_path,
class LagouJobItemLoader(ItemLoader):#自定义itemloaderdefault_output_processor = TakeFirst()class LagouJobItem(scrapy.Item):#拉勾网职位信息title = scrapy.Field()url =  scrapy.Field()url_object_id =  scrapy.Field()salary =  scrapy.Field()job_city =  scrapy.Field(input_processor = MapCompose(remove_splash))work_years =  scrapy.Field(input_processor = MapCompose(remove_splash))degree_need =  scrapy.Field(input_processor = MapCompose(remove_splash))job_type =  scrapy.Field()publish_time =  scrapy.Field()job_advantage = scrapy.Field()job_desc =  scrapy.Field()job_addr =  scrapy.Field(input_processor=MapCompose(remove_tags,handle_jobaddr))company_name =  scrapy.Field()company_url =  scrapy.Field()tags =  scrapy.Field(input_processor = Join(","))crawl_time =  scrapy.Field()def get_insert_sql(self):insert_sql = """
            insert into lagou_job(title,url,url_object_id,salary,job_city,work_years,degree_need,job_type,publish_time,job_advantage,job_desc,job_addr,company_name,company_url,tags,crawl_time) VALUES( %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)ON DUPLICATE KEY UPDATE salary=VALUES(salary),job_desc=VALUES(job_desc)        """
        params = (self["title"],self["url"],self["url_object_id"],self["salary"],self["job_city"],self["work_years"],self["degree_need"],self["job_type"],self["publish_time"],self["job_advantage"],self["job_desc"],self["job_addr"],self["company_name"],self["company_url"],self["tags"],self["crawl_time"].strftime(SQL_DATETIME_FORMAT))return insert_sql,params

lagou.py的文件如下

import scrapy
from datetime import datetime
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from ArticleSpider.items import LagouJobItem,LagouJobItemLoader
from ArticleSpider.utils.common import get_md5class LagouSpider(CrawlSpider):name = 'lagou'allowed_domains = ['www.lagou.com']start_urls = ['http://www.lagou.com/']
rules = (Rule(LinkExtractor(allow=("zhaopin/.*",)), follow=True),Rule(LinkExtractor(allow=("gongsi/\d+.html",)), follow=True),Rule(LinkExtractor(allow="jobs/\d+.html"), callback='parse_job', follow=True),#回调函数callback)def parse_job(self, response):#解析拉勾网的职位item_loader = LagouJobItemLoader(item=LagouJobItem(), response=response)  #连接数据库的重要语句item_loader.add_css("title", ".job-name::attr(title)")item_loader.add_value("url", response.url)item_loader.add_value("url_object_id", get_md5(response.url))item_loader.add_css("salary", ".job_request .salary::text")item_loader.add_xpath("job_city", "//*[@class='job_request']/p/span[2]/text()")item_loader.add_xpath("work_years", "//*[@class='job_request']/p/span[3]/text()")item_loader.add_xpath("degree_need", "//*[@class='job_request']/p/span[4]/text()")item_loader.add_xpath("job_type", "//*[@class='job_request']/p/span[5]/text()")item_loader.add_css("tags", '.position-label li::text')item_loader.add_css("publish_time", ".publish_time::text")item_loader.add_css("job_advantage", ".job-advantage p::text")item_loader.add_css("job_desc", ".job_bt div")item_loader.add_css("job_addr", ".work_addr")item_loader.add_css("company_name", "#job_company dt a img::attr(alt)")item_loader.add_css("company_url", "#job_company dt a::attr(href)")item_loader.add_value("crawl_time", datetime.now())job_item = item_loader.load_item()return job_item

这里需要注意的是:以前拉勾网是不需要验证user-agent的,现在需要了,所以要加入

   custom_settings = {"COOKIES_ENABLED": False,"DOWNLOAD_DELAY": 1,'DEFAULT_REQUEST_HEADERS': {'Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.8','Connection': 'keep-alive','Cookie': 'user_trace_token=20171015132411-12af3b52-3a51-466f-bfae-a98fc96b4f90; LGUID=20171015132412-13eaf40f-b169-11e7-960b-525400f775ce; SEARCH_ID=070e82cdbbc04cc8b97710c2c0159ce1; ab_test_random_num=0; X_HTTP_TOKEN=d1cf855aacf760c3965ee017e0d3eb96; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=0; PRE_UTM=; PRE_HOST=www.baidu.com; PRE_SITE=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DsXIrWUxpNGLE2g_bKzlUCXPTRJMHxfCs6L20RqgCpUq%26wd%3D%26eqid%3Dee53adaf00026e940000000559e354cc; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; index_location_city=%E5%85%A8%E5%9B%BD; TG-TRACK-CODE=index_hotjob; login=false; unick=""; _putrc=""; JSESSIONID=ABAAABAAAFCAAEG50060B788C4EED616EB9D1BF30380575; _gat=1; _ga=GA1.2.471681568.1508045060; LGSID=20171015203008-94e1afa5-b1a4-11e7-9788-525400f775ce; LGRID=20171015204552-c792b887-b1a6-11e7-9788-525400f775ce','Host': 'www.lagou.com','Origin': 'https://www.lagou.com','Referer': 'https://www.lagou.com/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',}}

然后就可以看到数据写入到我们的表中了

这里可能会出现tags的值错误,因为tags中有可能是为空的

类似于这个网站

https://www.lagou.com/jobs/67631.html

这里就没有tags

我们可以定义一个函数处理这个错误。(这里就不说怎么做了)

转载于:https://www.cnblogs.com/linyujin/p/9803112.html

通过CrawlSpider对招聘网站进行整站爬取(拉勾网实战)相关推荐

  1. python 爬虫 快看漫画整站爬取(解决动态加载漫画图片地址、漫画图片合成长图、图片文件排序等问题)

    运行结果: 这个是爬取的目标 爬取之后建立文件夹,合成长图之后删除文件夹 这里仅仅做几组演示, 由于合成的图片有单列长度限制,所有拆分成两列 开始: 首先打开网站,找到某个漫画,发现点鼠标右键不可以, ...

  2. wget整站抓取、网站抓取功能;下载整个网站;下载网站到本地

    wget -r   -p -np -k -E  http://www.xxx.com 抓取整站 wget -l 1 -p -np -k       http://www.xxx.com 抓取第一级 - ...

  3. python爬虫电影资源_【Python爬虫】第十六次 xpath整站抓取阳光电影网电影资源

    [Python爬虫]第十六次 xpath整站抓取阳光电影网电影资源# 一.解析电影url # 请求15题构造出的每个电影菜单的分页url,解析出每个电影url # 二.xpath解析电影资源 # 对第 ...

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

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

  5. python爬取新浪新闻首页_Python爬虫学习:微信、知乎、新浪等主流网站的模拟登陆爬取方法...

    微信.知乎.新浪等主流网站的模拟登陆爬取方法 摘要:微信.知乎.新浪等主流网站的模拟登陆爬取方法. 网络上有形形色色的网站,不同类型的网站爬虫策略不同,难易程度也不一样.从是否需要登陆这方面来说,一些 ...

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

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

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

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

  8. qu.la网站上的小说爬取

    qu.la网站上的小说爬取 ##这个项目是我最早开始写的爬虫项目,代码比较简陋 在写这个项目时,我还不会Python的协程编程,用协程可提升爬虫速度至少5倍,参考我的文章[线程,协程对比和Python ...

  9. 写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我...

    写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我 1.HttpUtil工具类,用于模拟用户登录以及爬取网页: using System; using ...

最新文章

  1. 转载:配置nginx支持pathinfo功能
  2. rpmdb open failed 的解决办法
  3. 2000坐标系高程与85高程转换_科普 | 如何在大疆智图中设置坐标系
  4. Android—— ScrollView 与 ListView 滑动冲突处理
  5. 树形DP求树的最小支配集,最小点覆盖,最大独立集
  6. ON1 photo raw 2021(ps/lr滤镜插件) 下载及安装
  7. Flutter文本输入框TextField控制器TextEditingController,TextField预设内容,获取TextField中的输入内容,兼听TextField中的内容变化
  8. JavaScript 中,定义函数时用 var foo = function () {} 和 function foo() 有什么区别?
  9. php7 opcode,php7最小化安装 vld扩展安装并查看php代码的opcode ast测试
  10. Android 数字动画
  11. 常见Struts、Hibernate、Spring、J2EE、ibatis、Oracle等开发框架架构图及其简介
  12. 解决qt调试时Unknown debugger type No Engine
  13. react-testing-library
  14. MUI调用照片以及裁剪和图库照片上传到服务器【后端部分Flask+MUI】
  15. 图漾深度相机FS820-E1使用
  16. 联想拯救者R7000_2020款黑屏解决方案
  17. 宽带服务器盒信号灯红色闪烁,移动盒子光信号闪红灯怎么回事
  18. 不规则裁剪图片css,使用CSS的clip-path属性实现不规则图形的显示
  19. 部署N9e-v3运维监控平台
  20. OSChina 周日乱弹 —— 怎样判别你是她的男神

热门文章

  1. winfrom 如何让弹窗不影响主界面_「Win」电脑开机后不给我弹几个广告,我还不太习惯...
  2. JavaScript是什么?JavaScript简介
  3. html表单转换文档代码,把HTML表单提交的数据转化成XML文件 (转)
  4. java linux web_java在Linux下的web应用(一)
  5. linux shell 批量清空,shell脚本批量删除docker镜像
  6. FPGA---多按键消抖检测
  7. 面试官问你Java内存区域你用new创建对象来解释
  8. python与机器学习(六)——支持向量机(SVM) 多层感知机(MLP)
  9. RuntimeError: expected a Variable argument, but got torch.FloatTensor
  10. Tensorflow 卷积神经网络 (四)cifar100实战