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

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

然后在navicat中设计表

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

  1. url varchar
  2. url_object_id varchar (作为主键)
  3. title varchar
  4. salary varchar (薪资) (不确定有没有工资,所以可以是空值)
  5. job_city varchar (可以为空)
  6. work_years varchar (可以为空)
  7. degree_need varchar (可以为空)
  8. job_type varchar (可以为空)
  9. publish_time varchar 可以想想怎么把varchar转换为datetime类型
  10. tags varchar varchar (可以为空)
  11. job_advantage varchar (可以为空)
  12. job_desc longtext
  13. job_addr varchar (可以为空) 具体工作地址
  14. company_url varchar (可以为空)
  15. company_name varchar (可以为空)
  16. crawl_time datetime
  17. crawl_update_time datetime (可以为空)

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

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

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

  1. import scrapy
  2. class LagouSpider(CrawlSpider):
  3. name = 'lagou'
  4. allowed_domains = ['www.lagou.com']
  5. start_urls = ['http://www.lagou.com/']
  6.  
  7. rules = (
  8. Rule(LinkExtractor(allow=("zhaopin/.*",)), follow=True),
  9. Rule(LinkExtractor(allow=("gongsi/\d+.html",)), follow=True),
  10. Rule(LinkExtractor(allow="jobs/\d+.html"), callback='parse_job', follow=True),
  11. )

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

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

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

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

在anaconda的命令行中使用命令

  1. 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中进行定义

  1. def remove_splash(value):
  2. #去掉工作城市的斜线
  3. return value.replace("/","")
  4. def handle_jobaddr(value):
  5. addr_list = value.split("\n")
  6. addr_list = [item.strip() for item in addr_list
  7. if item.strip()!="查看地图"]
  8. return "".join(addr_list)
  9. #self["front_image_path"], front_image_path,
  10. class LagouJobItemLoader(ItemLoader):
  11. #自定义itemloader
  12. default_output_processor = TakeFirst()
  13.  
  14. class LagouJobItem(scrapy.Item):
  15. #拉勾网职位信息
  16. title = scrapy.Field()
  17. url = scrapy.Field()
  18. url_object_id = scrapy.Field()
  19. salary = scrapy.Field()
  20. job_city = scrapy.Field(
  21. input_processor = MapCompose(remove_splash)
  22. )
  23. work_years = scrapy.Field(
  24. input_processor = MapCompose(remove_splash)
  25. )
  26. degree_need = scrapy.Field(
  27. input_processor = MapCompose(remove_splash)
  28. )
  29. job_type = scrapy.Field()
  30. publish_time = scrapy.Field()
  31. job_advantage = scrapy.Field()
  32. job_desc = scrapy.Field()
  33. job_addr = scrapy.Field(
  34. input_processor=MapCompose(remove_tags,handle_jobaddr)
  35. )
  36. company_name = scrapy.Field()
  37. company_url = scrapy.Field()
  38. tags = scrapy.Field(
  39. input_processor = Join(",")
  40. )
  41. crawl_time = scrapy.Field()
  42.  
  43. def get_insert_sql(self):
  44. insert_sql = """
  45. insert into lagou_job(title,url,url_object_id,
  46. salary,job_city,work_years,
  47. degree_need,job_type,publish_time,
  48. job_advantage,job_desc,job_addr,
  49. company_name,company_url,tags,
  50. crawl_time) VALUES( %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
  51. ON DUPLICATE KEY UPDATE salary=VALUES(salary),job_desc=VALUES(job_desc)
  52. """
  53. params = (
  54. self["title"],self["url"],self["url_object_id"],self["salary"],
  55. self["job_city"],self["work_years"],self["degree_need"],
  56. self["job_type"],self["publish_time"],self["job_advantage"],
  57. self["job_desc"],self["job_addr"],self["company_name"],
  58. self["company_url"],self["tags"],self["crawl_time"].strftime(SQL_DATETIME_FORMAT)
  59.  
  60. )
  61. return insert_sql,params

lagou.py的文件如下

  1. import scrapy
  2. from datetime import datetime
  3. from scrapy.linkextractors import LinkExtractor
  4. from scrapy.spiders import CrawlSpider, Rule
  5. from ArticleSpider.items import LagouJobItem,LagouJobItemLoader
  6. from ArticleSpider.utils.common import get_md5
  7.  
  8. class LagouSpider(CrawlSpider):
  9. name = 'lagou'
  10. allowed_domains = ['www.lagou.com']
  11. start_urls = ['http://www.lagou.com/']
  12.  
  13. rules = (
  14. Rule(LinkExtractor(allow=("zhaopin/.*",)), follow=True),
  15. Rule(LinkExtractor(allow=("gongsi/\d+.html",)), follow=True),
  16. Rule(LinkExtractor(allow="jobs/\d+.html"), callback='parse_job', follow=True),#回调函数callback
  17. )
  18.  
  19. def parse_job(self, response):
  20. #解析拉勾网的职位
  21. item_loader = LagouJobItemLoader(item=LagouJobItem(), response=response) #连接数据库的重要语句
  22. item_loader.add_css("title", ".job-name::attr(title)")
  23. item_loader.add_value("url", response.url)
  24. item_loader.add_value("url_object_id", get_md5(response.url))
  25. item_loader.add_css("salary", ".job_request .salary::text")
  26. item_loader.add_xpath("job_city", "//*[@class='job_request']/p/span[2]/text()")
  27. item_loader.add_xpath("work_years", "//*[@class='job_request']/p/span[3]/text()")
  28. item_loader.add_xpath("degree_need", "//*[@class='job_request']/p/span[4]/text()")
  29. item_loader.add_xpath("job_type", "//*[@class='job_request']/p/span[5]/text()")
  30. item_loader.add_css("tags", '.position-label li::text')
  31. item_loader.add_css("publish_time", ".publish_time::text")
  32. item_loader.add_css("job_advantage", ".job-advantage p::text")
  33. item_loader.add_css("job_desc", ".job_bt div")
  34. item_loader.add_css("job_addr", ".work_addr")
  35. item_loader.add_css("company_name", "#job_company dt a img::attr(alt)")
  36. item_loader.add_css("company_url", "#job_company dt a::attr(href)")
  37. item_loader.add_value("crawl_time", datetime.now())
  38.  
  39. job_item = item_loader.load_item()
  40.  
  41. return job_item

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

  1. custom_settings = {
  2. "COOKIES_ENABLED": False,
  3. "DOWNLOAD_DELAY": ,
  4. 'DEFAULT_REQUEST_HEADERS': {
  5. 'Accept': 'application/json, text/javascript, */*; q=0.01',
  6. 'Accept-Encoding': 'gzip, deflate, br',
  7. 'Accept-Language': 'zh-CN,zh;q=0.8',
  8. 'Connection': 'keep-alive',
  9. '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',
  10. 'Host': 'www.lagou.com',
  11. 'Origin': 'https://www.lagou.com',
  12. 'Referer': 'https://www.lagou.com/',
  13. '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',
  14. }
  15. }

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

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

类似于这个网站

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

这里就没有tags

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

通过CrawlSpider对招聘网站进行整站爬取(拉勾网实战)的更多相关文章

  1. 第6章 通过CrawlSpider对招聘网站进行整站爬取

    通过前几章的2个项目的学习,其实本章的拉钩网项目还是挺容易理解的. 本章主要的还是对CrawlSpider源码的解析,其实我对源码还不是很懂,只是会基本的一些功能而已. 不分小节记录了,直接上知识点, ...

  2. Scrapy 使用CrawlSpider整站抓取文章内容实现

    刚接触Scrapy框架,不是很熟悉,之前用webdriver+selenium实现过头条的抓取,但是感觉对于整站抓取,之前的这种用无GUI的浏览器方式,效率不够高,所以尝试用CrawlSpider来实 ...

  3. 网站seo整站优化有什么优势

    http://www.wocaoseo.com/thread-314-1-1.html       现在很多企业找网络公司做网站优化,已经不再像以前那样做目标关键词,而是通过整站优化来达到企业营销目的 ...

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

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

  5. 爬取拉勾网招聘信息并使用xlwt存入Excel

    xlwt 1.3.0 xlwt 文档 xlrd 1.1.0 python操作excel之xlrd 1.Python模块介绍 - xlwt ,什么是xlwt? Python语言中,写入Excel文件的扩 ...

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

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

  7. python爬虫10 b站爬取使用 selenium+ phantomJS

    但有时候 我们不想要让它打开浏览器去执行 能不能直接在代码里面运行呢 也就是说 有没有一个无形的浏览器呢 恩 phantomJS 就是 它是一个基于 WebKit 的浏览器引擎 可以做到无声无息的操作 ...

  8. 8月份Python招聘情况怎么样?Python爬取招聘数据,并进行分析

    前言 拉勾招聘是专业的互联网求职招聘平台.致力于提供真实可靠的互联网招聘求职找工作信息.今天我们一起使用 python 采集拉钩的 python 招聘信息,分析一下找到高薪工作需要掌握哪些技术 开发环 ...

  9. 歌曲网站,教你爬取 mp3 和 lyric

    从歌曲网站,获取音频和歌词的流程: 1, 输入歌曲名,查找网站中存在的歌曲 id 2, 拿歌曲 id 下载歌词 lyric 简单的 url 拼接 3, 拿歌曲 id 下载音频 mp3 先用一个 POS ...

随机推荐

  1. Linux - 找到正在使用的 Shell 是哪个

    1. ps -p $$ 一个名为 "$$" (这是shell的特殊参数),表示当前你正在运行的 shell 实例的 PID 2. echo $0 3. echo $SHELL - ...

  2. spring web 测试用例

    spring web 测试有三种方式 1. 自己初始化 MockMvc 2.依赖@springbootTest 它会帮你生产 webTestClient ,只需自己注入即可. 3.启动的时候,不加载整 ...

  3. float,double,int的区别

    int num = 10/4; float num2 = 10/4; double num3 = 10.0/4.0; System.out.println(num); System.out.print ...

  4. Services: ARP Caching

    Online Help for Cisco IOS Release 12.2(15)JA Services: ARP Caching   ARP caching on the access point ...

  5. 前缀和-Big Water Problem (牛客)

    链接:https://ac.nowcoder.com/acm/problem/15164 题目描述 给一个数列,会有多次询问,对于每一次询问,会有两种操作: 1:给定两个整数x, y, 然后在原数组的 ...

  6. 一个高级PHP工程师所应该具备的(转自元如枫博客)

    初次接触PHP,就为他的美所折服,于是一发不可收拾. 很多面试,很多人员能力要求都有“PHP高级工程师的字眼”,如果您真心喜欢PHP,并且您刚起步,那么我简单说说一个PHP高级工程师所应该具备的,希望 ...

  7. nyoj 40

    题目:http://acm.nyist.edu.cn/JudgeOnline/status.php?pid=40 求最大公约数和最小公倍数... 思路:欧几里德算法求出最大公约数,即最大公约数 = g ...

  8. 【Javaweb】Servlet的xml和注解配置

    1.xml <%@ page language="java" contentType="text/html;" %> <!DOCTYPE ht ...

  9. js中字符串转json对象时报错: Uncaught SyntaxError: Unexpected token s in JSON at position 2

    解决方法: js中获取jsp的返回值 var json='${channels}' var channels = JSON.parse(json);就报上面的错. json的值最终会转成这种json格 ...

  10. kubernetes从入门到放弃(二)

    kubernetes对象之pod 1.pod的认识 Pod直译是豆荚,可以把容器想像成豆荚里的豆子,把一个或多个关系紧密的豆子包在一起就是豆荚(一个Pod).在Kubernetes中我们不会直接操作容 ...