Python爬虫框架Scrapy获得定向打击批量招聘信息

Python爬虫框架Scrapy获得定向打击批量招聘信息

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

 

    爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这样的说法不够专业,更专业的描写叙述就是。抓取特定站点网页的HTML数据。只是因为一个站点的网页非常多,而我们又不可能事先知道全部网页的URL地址,所以,怎样保证我们抓取到了站点的全部HTML页面就是一个有待考究的问题了。

一般的方法是,定义一个入口页面。然后一般一个页面会有其它页面的URL,于是从当前页面获取到这些URL增加到爬虫的抓取队列中。然后进入到新页面后再递归的进行上述的操作。事实上说来就跟深度遍历或广度遍历一样。

 

    Scrapy是一个基于Twisted,纯Python实现的爬虫框架,用户仅仅须要定制开发几个模块就能够轻松的实现一个爬虫,用来抓取网页内容以及各种图片,很之方便~

 

    Scrapy 使用 Twisted这个异步网络库来处理网络通讯,架构清晰,而且包括了各种中间件接口,能够灵活的完毕各种需求。总体架构例如以下图所看到的:

Python爬虫框架Scrapy获得定向打击批量招聘信息

    绿线是数据流向,首先从初始URL 開始。Scheduler 会将其交给 Downloader 进行下载。下载之后会交给 Spider 进行分析。Spider分析出来的结果有两种:一种是须要进一步抓取的链接,比如之前分析的“下一页”的链接,这些东西会被传回 Scheduler ;还有一种是须要保存的数据,它们则被送到Item Pipeline 那里。那是对数据进行后期处理(具体分析、过滤、存储等)的地方。

另外,在数据流动的通道里还能够安装各种中间件,进行必要的处理。

我假定你已经安装了Scrapy。假如你没有安装,你能够參考这篇文章

 

在本文中,我们将学会怎样使用Scrapy建立一个爬虫程序,并爬取指定站点上的内容

1. 创建一个新的Scrapy Project

2. 定义你须要从网页中提取的元素Item

3.实现一个Spider类,通过接口完毕爬取URL和提取Item的功能

4. 实现一个Item PipeLine类,完毕Item的存储功能

 

我将会用腾讯招聘官网作为样例。

Github源代码:https://github.com/maxliaops/scrapy-itzhaopin

Python爬虫框架Scrapy获得定向打击批量招聘信息

目标:抓取腾讯招聘官网职位招聘信息并保存为JSON格式。

新建project

首先,为我们的爬虫新建一个project,首先进入一个文件夹(随意一个我们用来保存代码的文件夹),运行:

scrapy startprojectitzhaopin

 

最后的itzhaopin就是项目名称。这个命令会在当前文件夹下创建一个新文件夹itzhaopin,结构例如以下:

.

├── itzhaopin

   ├── itzhaopin

   │   ├── __init__.py

   │   ├── items.py

   │   ├── pipelines.py

   │   ├── settings.py

   │   └── spiders

   │      └── __init__.py

   └── scrapy.cfg

 

scrapy.cfg: 项目配置文件

items.py: 须要提取的数据结构定义文件

pipelines.py:管道定义。用来对items里面提取的数据做进一步处理,如保存等

settings.py: 爬虫配置文件

spiders: 放置spider的文件夹

定义Item

在items.py里面定义我们要抓取的数据:

 

from scrapy.item import Item, Field
class TencentItem(Item):
    name = Field()                # 职位名称
    catalog = Field()             # 职位类别
    workLocation = Field()        # 工作地点
    recruitNumber = Field()       # 招聘人数
    detailLink = Field()          # 职位详情页链接
    publishTime = Field()         # 公布时间

实现Spider

Spider是一个继承自scrapy.contrib.spiders.CrawlSpider的Python类,有三个必需的定义的成员

name: 名字。这个spider的标识

start_urls:一个url列表,spider从这些网页開始抓取

parse():一个方法。当start_urls里面的网页抓取下来之后须要调用这种方法解析网页内容,同一时候须要返回下一个须要抓取的网页。或者返回items列表

所以在spiders文件夹下新建一个spider。tencent_spider.py:

import re
import json


from scrapy.selector import Selector
try:
    from scrapy.spider import Spider
except:
    from scrapy.spider import BaseSpider as Spider
from scrapy.utils.response import get_base_url
from scrapy.utils.url import urljoin_rfc
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor as sle


from itzhaopin.items import *
from itzhaopin.misc.log import *


class TencentSpider(CrawlSpider):
    name = "tencent"
    allowed_domains = ["tencent.com"]
    start_urls = [
        "http://hr.tencent.com/position.php"
    ]
    rules = [ # 定义爬取URL的规则
        Rule(sle(allow=("/position.php\?&start=\d{,4}#a")), follow=True, callback='parse_item')
    ]

    def parse_item(self, response): # 提取数据到Items里面,主要用到XPath和CSS选择器提取网页数据
        items = []
        sel = Selector(response)
        base_url = get_base_url(response)
        sites_even = sel.css('table.tablelist tr.even')
        for site in sites_even:
            item = TencentItem()
            item['name'] = site.css('.l.square a').xpath('text()').extract()
            relative_url = site.css('.l.square a').xpath('@href').extract()[0]
            item['detailLink'] = urljoin_rfc(base_url, relative_url)
            item['catalog'] = site.css('tr > td:nth-child(2)::text').extract()
            item['workLocation'] = site.css('tr > td:nth-child(4)::text').extract()
            item['recruitNumber'] = site.css('tr > td:nth-child(3)::text').extract()
            item['publishTime'] = site.css('tr > td:nth-child(5)::text').extract()
            items.append(item)
            #print repr(item).decode("unicode-escape") + '\n'

        sites_odd = sel.css('table.tablelist tr.odd')
        for site in sites_odd:
            item = TencentItem()
            item['name'] = site.css('.l.square a').xpath('text()').extract()
            relative_url = site.css('.l.square a').xpath('@href').extract()[0]
            item['detailLink'] = urljoin_rfc(base_url, relative_url)
            item['catalog'] = site.css('tr > td:nth-child(2)::text').extract()
            item['workLocation'] = site.css('tr > td:nth-child(4)::text').extract()
            item['recruitNumber'] = site.css('tr > td:nth-child(3)::text').extract()
            item['publishTime'] = site.css('tr > td:nth-child(5)::text').extract()
            items.append(item)
            #print repr(item).decode("unicode-escape") + '\n'

        info('parsed ' + str(response))
        return items


    def _process_request(self, request):
        info('process ' + str(request))
        return request

实现PipeLine

 

PipeLine用来对Spider返回的Item列表进行保存操作,能够写入到文件、或者数据库等。

PipeLine仅仅有一个须要实现的方法:process_item。比如我们将Item保存到JSON格式文件里:

 

pipelines.py

from scrapy import signals
import json
import codecs

class JsonWithEncodingTencentPipeline(object):

    def __init__(self):
        self.file = codecs.open('tencent.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 item

    def spider_closed(self, spider):
        self.file.close(
)

到如今,我们就完毕了一个主要的爬虫的实现,能够输入以下的命令来启动这个Spider:

scrapy crawl tencent

 

爬虫执行结束后,在当前文件夹下将会生成一个名为tencent.json的文件,当中以JSON格式保存了职位招聘信息。

部分内容例如以下:

{“recruitNumber”: [“1”], “name”: [“SD5-资深手游策划(深圳)”], “detailLink”: “http://hr.tencent.com/position_detail.php?id=15626&keywords=&tid=0&lid=0”, “publishTime”: [“2014-04-25”], “catalog”: [“产品/项目类”], “workLocation”: [“深圳”]}

{“recruitNumber”: [“1”], “name”: [“TEG13-后台开发project师(深圳)”], “detailLink”: “http://hr.tencent.com/position_detail.php?id=15666&keywords=&tid=0&lid=0”, “publishTime”: [“2014-04-25”], “catalog”: [“技术类”], “workLocation”: [“深圳”]}

{“recruitNumber”: [“2”], “name”: [“TEG12-数据中心高级经理(深圳)”], “detailLink”: “http://hr.tencent.com/position_detail.php?

id=15698&keywords=&tid=0&lid=0″, “publishTime”: [“2014-04-25”], “catalog”: [“技术类”], “workLocation”: [“深圳”]}
{“recruitNumber”: [“1”], “name”: [“GY1-微信支付品牌策划经理(深圳)”], “detailLink”: “http://hr.tencent.com/position_detail.php?id=15710&keywords=&tid=0&lid=0”, “publishTime”: [“2014-04-25”], “catalog”: [“市场类”], “workLocation”: [“深圳”]}
{“recruitNumber”: [“2”], “name”: [“SNG06-后台开发project师(深圳)”], “detailLink”: “http://hr.tencent.com/position_detail.php?id=15499&keywords=&tid=0&lid=0”, “publishTime”: [“2014-04-25”], “catalog”: [“技术类”], “workLocation”: [“深圳”]}
{“recruitNumber”: [“2”], “name”: [“OMG01-腾讯时尚视频策划编辑(北京)”], “detailLink”: “http://hr.tencent.com/position_detail.php?id=15694&keywords=&tid=0&lid=0”, “publishTime”: [“2014-04-25”], “catalog”: [“内容编辑类”], “workLocation”: [“北京”]}
{“recruitNumber”: [“1”], “name”: [“HY08-QTclientWindows开发project师(深圳)”], “detailLink”: “http://hr.tencent.com/position_detail.php?

id=11378&keywords=&tid=0&lid=0″, “publishTime”: [“2014-04-25”], “catalog”: [“技术类”], “workLocation”: [“深圳”]}
{“recruitNumber”: [“5”], “name”: [“HY1-移动游戏測试经理(上海)”], “detailLink”: “http://hr.tencent.com/position_detail.php?id=15607&keywords=&tid=0&lid=0”, “publishTime”: [“2014-04-25”], “catalog”: [“技术类”], “workLocation”: [“上海”]}
{“recruitNumber”: [“1”], “name”: [“HY6-网吧平台高级产品经理(深圳)”], “detailLink”: “http://hr.tencent.com/position_detail.php?id=10974&keywords=&tid=0&lid=0”, “publishTime”: [“2014-04-25”], “catalog”: [“产品/项目类”], “workLocation”: [“深圳”]}
{“recruitNumber”: [“4”], “name”: [“TEG14-云存储研发project师(深圳)”], “detailLink”: “http://hr.tencent.com/position_detail.php?

id=15168&keywords=&tid=0&lid=0″, “publishTime”: [“2014-04-24”], “catalog”: [“技术类”], “workLocation”: [“深圳”]}
{“recruitNumber”: [“1”], “name”: [“CB-薪酬经理(深圳)”], “detailLink”: “http://hr.tencent.com/position_detail.php?id=2309&keywords=&tid=0&lid=0”, “publishTime”: [“2013-11-28”], “catalog”: [“职能类”], “workLocation”: [“深圳”]}

版权声明:本文博主原创文章。博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116939.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 罗技k380无线键盘怎么连接电脑_罗技k480切换输入法

    罗技k380无线键盘怎么连接电脑_罗技k480切换输入法一、核实蓝牙键盘是否开启:蓝牙键盘有单独的开关,若蓝牙键盘没有打开,则无法使用。开启方法:键盘开机键在键盘的左侧位置,将开关向左移动到ON即可开启,二、核实蓝牙键盘是否有电:蓝牙键盘是需要单独充电的设备,若蓝牙键盘没有电,则无法使用。充电方法:在键盘左侧位置有充电端口,将充电器连接到此端口即可为键盘充电注:键盘充电时,电源指示灯会变为红色,充电完毕后,电源指示灯会变为蓝色。三、将键盘与平板电脑重新…

    2022年10月15日
  • vue子组件向父组件传值的三种方式_vue子组件修改父组件值

    vue子组件向父组件传值的三种方式_vue子组件修改父组件值如需了解老子怎么控制儿子的,传送门:子组件child.vue<template><div><button@click=”$emit(’emit’,’方式1:传参给父组件第1个参数’,’方式1:传参给父组件第2个参数’,’…’)”>方式1:通过emit传参给父组件(推荐此方式)</button><button@click=”emit(‘方式2:传参给父组件第1个参数’,’方式2…

  • java中的maven_maven创建web项目

    java中的maven_maven创建web项目一、前言早就知道maven在java项目的管理方面名声显赫,于是就想着学习掌握之,于是查阅了大量文档。发现这些文档的作者都是java的大腕,大多都是站在掌握了一定maven基础的角度上进行介绍,让我这初学者看的云里雾里不知所云。于是又去查看maven的官方网站,总算是有所了解,但一旦动手实际操作却又雾里看花。唉,没办法,就只有一遍一遍的动手尝试,经过种种磨难总算是有一点眉…

  • 图像生成与图像处理_matlab中colorbar是什么意思

    图像生成与图像处理_matlab中colorbar是什么意思1colorBar介绍colorBar主要是指一些图像处理中使用的常见纯色或者渐变色条。colorBar用途可作为测试样图来验证某些图像算法的效果,从而避免图像内容或者硬件对图像的干扰,使图像算法

  • (转)postMessage使用方法

    (转)postMessage使用方法postMessage使用方法

    2022年10月29日
  • SVN和Git 介绍,区别,优缺点以及适用范围

    SVN和Git 介绍,区别,优缺点以及适用范围

    2021年10月30日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号