一、开发环境

OS:Windows 7 64bit旗舰版        
       Python:2.7.10        
       Scrapy:1.0.3        
       MySQL:5.6.21        
       Sublime Text2:2.0.2        
       具体的开发环境配置这里就不介绍了,如需了解,欢迎与我交流。

二、目标

通过在前程无忧的职位搜索中输入职位关键词获取相应的职位信息,现在我们通过Scrapy爬虫来实现这个功能,自动帮我们获取相关的职位信息,并保存成.json格式和保存到MySQL数据库。

三、实现步骤

Scrapy是一个比较流行的Python爬虫框架,Scrapy爬虫的基本实现流程如下:

1.通过scrapy startproject spiderproject 来创建一个新的爬虫工程,spiderproject是我们自己命名的爬虫工程。比如本例子,我们创建一个工程scrapy startproject qcwy,qcwy即为我们的工程名。

2.定义我们要解析具体数据的Item结构,在items.py文件中。

3.在pipelines.py中实现数据存储的功能,可以在这里实现我们抓取的数据保存在.json文件中,或者MySQL中,或者SQLite中,或者MongoDB中,或者其他你要保存的格式或者数据库中。

4.在第1步创建的工程文件夹下的spider文件目录下创建一个新的后缀为.py的文件命名最好包含spider这个单词,因为我们要在这个文件中实现核心功能Spider。

5.在setting.py中进行一些相关的设置。

     下面我们以详细实例说明如何以Scrapy实现我们的目的:

1.在CMD中输入 cd c:\  进入c盘根目录

2.输入scrapy startproject qcwy,我们可以看到在c盘根目录下看到qcwy这个文件夹(本文假如你的开发环境配置没有任何问题,具体配置请参照Scrapy文档)。

进入qcwy文件夹后,可以看到还有一个qcwy的文件夹和一个scrapy.cfg项目配置文件,不用管它,继续进入qcwy这个文件夹,可以看到:

3.定义我们要解析的数据的Item类

实现items.py详细代码:

from scrapy.item import Item, Fieldclass QcwyItem(Item):#定义要抓取信息的Item结构title       = Field()   #职位名称link        = Field()   #详情链接company     = Field()   #公司名称   updatetime  = Field()   #更新时间

4.实现pipelines.py的详细代码:

import json
import codecs
import MySQLdb
import MySQLdb.cursorsfrom twisted.enterprise import adbapi
from scrapy import signalsclass QcwyJsonPipeline(object):def __init__(self):self.file = codecs.open('..\\qcwy\\qcwy\\qcwy.json', 'w', encoding = 'utf-8')def process_item(self, item, spider):line = json.dumps(dict(item), ensure_ascii = False) + "\n"self.file.write(line)return itemdef spider_closed(self, spider):self.file.close() class QcwyMySQLPipeline(object):"""docstring for MySQLPipeline"""def __init__(self):self.connpool = adbapi.ConnectionPool('MySQLdb',host = '127.0.0.1',db = 'qcwy',user = 'root',passwd = '',cursorclass = MySQLdb.cursors.DictCursor,charset = 'utf8',use_unicode = True)def process_item(self, item, spider):query = self.connpool.runInteraction(self._conditional_insert, item)query.addErrback(self.handle_error)return itemdef _conditional_insert(self, tx, item):if item.get('title'):tx.execute("insert into detail (title, link, company, updatetime) values(%s, %s, %s, %s)", (item['title'], item['link'], item['company'], item['updatetime']))def handle_error(self, e):log.err(e)

5.Spider的实现

# -*- coding: utf-8 -*-import logging
import scrapy
import urllib
import codecsfrom scrapy.selector import Selectorfrom qcwy.items import QcwyItemimport sys
reload(sys)
sys.setdefaultencoding('utf-8')keyword = "Python"
#把字符串编码成符合url规范的编码
keywordcode = urllib.quote(keyword)is_start_page = Trueclass TestfollowSpider(scrapy.Spider):name = "qcwysearch"allowed_domains = ["51job.com"]start_urls = ["http://search.51job.com/jobsearch/search_result.php?fromJs=1&jobarea=030200%2C00&funtype=0000&industrytype=00&keyword=" + keywordcode,]def parse(self, response):global is_start_pageurl = ""#从开始页面开始解析数据,开始页面start_urlsif is_start_page:url = self.start_urls[0]is_start_page = Falseelse:href = response.xpath('//table[@class="searchPageNav"]/tr/td[last()]/a/@href')url = response.urljoin(href.extract())yield scrapy.Request(url, callback=self.parse_dir_contents)def parse_dir_contents(self, response):for sel in response.xpath('//table[@id="resultList"]/tr[@class="tr0"]'):item = QcwyItem()temp = sel.xpath('td[@class="td1"]/a/text()').extract()if len(temp) > 0:item['title'] = temp[0] + keyword + temp[-1]else:item['title'] = keyworditem['link'] = sel.xpath('td[@class="td1"]/a/@href').extract()[0]item['company'] = sel.xpath('td[@class="td2"]/a/text()').extract()[0]item['updatetime'] = sel.xpath('td[@class="td4"]/span/text()').extract()[0]yield itemnext_page = response.xpath('//table[@class="searchPageNav"]/tr/td[last()]/a/@href')if next_page:url = response.urljoin(next_page[0].extract())yield scrapy.Request(url, self.parse_dir_contents)

6.在setting.py中加入:

ITEM_PIPELINES = {'qcwy.pipelines.QcwyJsonPipeline': 300,'qcwy.pipelines.QcwyMySQLPipeline': 800,
}

7.在CMD中输入cd c:\qcwy进入工程目录

输入scrapy crawl qcwysearch

然后查看生成的json文件,可以看到以下我们想要的信息:

{"company": "广东威法科技发展有限公司", "link": "http://search.51job.com/job/70631365,c.html", "updatetime": "2015-09-29", "title": "中级后端Python工程师"}
{"company": "珠海横琴新区盖网通传媒有限公司广州分公司", "link": "http://search.51job.com/job/69706486,c.html", "updatetime": "2015-09-29", "title": "开发工程师Python开发工程师"}
{"company": "广州明朝互动科技股份有限公司", "link": "http://search.51job.com/job/69898292,c.html", "updatetime": "2015-09-29", "title": "开发工程师Python开发工程师"}
{"company": "广州市赛酷比软件有限公司", "link": "http://search.51job.com/job/69816266,c.html", "updatetime": "2015-09-29", "title": "分布式软件架构师(Python..."}
{"company": "广州市赛酷比软件有限公司", "link": "http://search.51job.com/job/69816017,c.html", "updatetime": "2015-09-29", "title": "爬虫工程师Python爬虫工程师"}
{"company": "广州杰升信息科技有限公司", "link": "http://search.51job.com/job/51077705,c.html", "updatetime": "2015-09-29", "title": "工程师Python工程师"}
{"company": "广州飞屋网络科技有限公司", "link": "http://search.51job.com/job/71800002,c.html", "updatetime": "2015-09-29", "title": "开发工程师Python开发工程师"}
{"company": "广州飞屋网络科技有限公司", "link": "http://search.51job.com/job/59931502,c.html", "updatetime": "2015-09-29", "title": "开发工程师Python开发工程师"}
{"company": "广州达新信息科技有限公司", "link": "http://search.51job.com/job/69614188,c.html", "updatetime": "2015-09-29", "title": "开发工程师Python开发工程师"}
{"company": "广州埃立方通信技术有限公司", "link": "http://search.51job.com/job/71920362,c.html", "updatetime": "2015-09-29", "title": "软件工程师Python软件工程师"}
{"company": "广州黑珍珠计算机技术有限公司", "link": "http://search.51job.com/job/60592771,c.html", "updatetime": "2015-09-29", "title": "服务器端程序员Python服务器端程序员"}
{"company": "聚力精彩(北京)信息技术有限公司", "link": "http://search.51job.com/job/72246020,c.html", "updatetime": "2015-09-29", "title": "高级开发工程师AEBPython高级开发工程师AEB"}
{"company": "广州七乐康药业连锁有限公司", "link": "http://search.51job.com/job/71362309,c.html", "updatetime": "2015-09-29", "title": "中级开发工程师Python中级开发工程师"}
{"company": "广州七乐康药业连锁有限公司", "link": "http://search.51job.com/job/69404827,c.html", "updatetime": "2015-09-29", "title": " 初级开发工程师Python 初级开发工程师"}
{"company": "广州七乐康药业连锁有限公司", "link": "http://search.51job.com/job/69207304,c.html", "updatetime": "2015-09-29", "title": "资深开发工程师Python资深开发工程师"}
{"company": "贵州格安科技有限公司广州分公司", "link": "http://search.51job.com/job/63157264,c.html", "updatetime": "2015-09-29", "title": "高级Python开发工程师"}
{"company": "贵州格安科技有限公司广州分公司", "link": "http://search.51job.com/job/60035771,c.html", "updatetime": "2015-09-29", "title": " 开发工程师Python 开发工程师"}
{"company": "珠海麒润网络科技有限公司", "link": "http://search.51job.com/job/51153619,c.html", "updatetime": "2015-09-29", "title": "PHP/Python开发工程师"}
{"company": "广州百伦贸易有限公司", "link": "http://search.51job.com/job/71097137,c.html", "updatetime": "2015-09-29", "title": "开发工程师Python开发工程师"}
{"company": "广州暴雨网络技术有限公司", "link": "http://search.51job.com/job/69546409,c.html", "updatetime": "2015-09-29", "title": "服务端开发工程师Python服务端开发工程师"}

通过phpMyAdmin来查看MySQL数据库,可以看到:

8.完整源码地址:  https://github.com/vrrobot/qcwy

四、后记         这篇到这里就结束了,网络爬虫这个技术作为一个非常常规的获取信息的手段,当然如果用作生产工具的话,还有一些不足的地方。比如:如何使爬虫的行为更像我们在使用浏览器在浏览信息。接下来,还会有本篇的后续进阶篇。

Scrapy爬虫实践之搜索并获取前程无忧职位信息(基础篇)相关推荐

  1. scrapy爬虫实践之抓取拉钩网招聘信息(4)

    拉勾的302搞的我不心力憔悴,几乎失去了动力继续再研究拉勾爬虫-实际上,这种无力感很大程度上来源于知识结构的匮乏(尤其是基础方面)和毫无进展带来的挫败感. 于是乎去读基础教程<learning ...

  2. scrapy爬虫实践之抓取拉钩网招聘信息(2)

    今天遇到了一个百思不得其解的问题.我用xpath获取目标网页的divs,理论上来说,应该是把这个div下的所有div存进了列表里,但是语句却是这样写的 divs = response.xpath('/ ...

  3. 【爬虫实践】用递归获取网站的所有内链和外链

    [爬虫实践]用递归获取网站的所有内链和外链 环境:Windows7 +Python3.6+Pycharm2017 目标:从一个网站的顶层开始,爬取该网站所有内链和外链,便于绘制网站地图! 通常网站的深 ...

  4. 【scrapy】实战爬取前程无忧职位信息

    @Hadi 初来乍到 多多点赞 文章目录 @Hadi 前言 一.简述Scrapy 1.什么是scrpay框架 2.基本架构 二.需求分析 1.需求是什么 2.对目标页面进行分析 URL结构分析 三.开 ...

  5. java爬虫之WebMagic实战抓取前程无忧招聘信息

    webmagic教程 http://webmagic.io/docs/zh/ 入门案例 package com.hikktn.webmagic;import us.codecraft.webmagic ...

  6. 最新puppeteer爬虫boss直聘招聘公司及职位信息

    ​失踪人口回归了!由于一直在爬虫,遇到的坑比较多,先大致汇报下 1.获取全国所有企业 2.通过企查查补充企业信息 3.爬虫boss直聘获取公司及职位信息 本次先说爬虫boss直聘 目的: 获取指定城市 ...

  7. python爬取前程无忧职位信息

    欢迎关注我的微信公众号:AI进阶者,每天分享技术干货 相信很多小伙伴都面临找工作的问题,本人目前正在魔都读研,也面临明年春招找实习秋招找工作等一系列问题,由于本人的专业为机械专业,结合今年的就业状况( ...

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

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

  9. python爬虫-爬取boss直聘的职位信息

    爬取boss直聘的相应的职位信息: 一个同学今天想找工作,问我有什么好单位,关键我也不清楚,于是我去各大招聘网站搜索了下,有很多招聘信息,看的我眼花缭乱,刚看完的职位,忘记收藏又过去搜索,感觉太麻烦, ...

最新文章

  1. Excel直接转图片
  2. Silverlight2.0中与Html页面元素互操作.
  3. 关于系统用户数,并发用户数,在线用户数,吞吐量
  4. jpa一对多映射案例
  5. [Elixir008]Nested Module里的动态函数调用方式
  6. float,double等精度丢失问题
  7. ssm中spring mvc找不到控制器,报错404
  8. sql server 数据库忘记sa账户密码/ 无管理员账户解决办法
  9. 精度高、模型小、速度快!梯形DenseNets结构实现语义分割新高度!
  10. 一则非常巧合的ORA-15042恢复
  11. Nginx、Haproxy、LVS负载均衡从原理到部署(一)
  12. html只能选择年月,EasyUi日期控件datebox设置,只显示年月,也只能选择年月
  13. IT技术中的言情小说
  14. android 制作 win10,你真没有看错!Android手机一秒变Win10
  15. 计算机基础教程(一)
  16. ClientToScreen ScreenToClient GetWindowRect GetClientRect
  17. 【Windows Server 2019】存储服务器的配置和管理——iSCSI的安装和配置(下)
  18. 天使投资人如何评估创业公司价值
  19. 按钮样式动态切换js
  20. jsp+ssm计算机毕业设计学校缴费系统【附源码】

热门文章

  1. 如何使用《背景音乐提取器》提取歌曲中的背景音乐
  2. 华为4G无线路由器测试锁频软件,华为4g无线路由器 新款E5375路由器测试
  3. 网约车中场战事:曹操出行融资数十亿,谁在觊觎龙头位置?
  4. python调用百度翻译api+离线语种检测
  5. 宅兔APP技术服务支持
  6. Java手机游戏开发简明教程 (SunJava开发者认证程序员 郎锐)
  7. 表单提交成功如何弹出提示
  8. 物联网(AIOT)--下一个技术风口
  9. python爬取斗鱼B总直播弹幕
  10. c++ 中对vector的使用方法