国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Python爬蟲(chóng)框架Scrapy實(shí)戰(zhàn)之批量抓取招聘信息

2020-01-04 17:59:14
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
網(wǎng)絡(luò)爬蟲(chóng)又被稱為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò)機(jī)器人,在FOAF社區(qū)中間,更經(jīng)常的稱為網(wǎng)頁(yè)追逐者,是按照一定的規(guī)則,自動(dòng)抓取萬(wàn)維網(wǎng)信息的程序或者腳本。這篇文章主要介紹Python爬蟲(chóng)框架Scrapy實(shí)戰(zhàn)之批量抓取招聘信息,有需要的朋友可以參考下
 

網(wǎng)絡(luò)爬蟲(chóng)抓取特定網(wǎng)站網(wǎng)頁(yè)的html數(shù)據(jù),但是一個(gè)網(wǎng)站有上千上萬(wàn)條數(shù)據(jù),我們不可能知道網(wǎng)站網(wǎng)頁(yè)的url地址,所以,要有個(gè)技巧去抓取網(wǎng)站的所有html頁(yè)面。Scrapy是純Python實(shí)現(xiàn)的爬蟲(chóng)框架,用戶只需要定制開(kāi)發(fā)幾個(gè)模塊就可以輕松的實(shí)現(xiàn)一個(gè)爬蟲(chóng),用來(lái)抓取網(wǎng)頁(yè)內(nèi)容以及各種圖片,非常之方便~

   Scrapy 使用wisted這個(gè)異步網(wǎng)絡(luò)庫(kù)來(lái)處理網(wǎng)絡(luò)通訊,架構(gòu)清晰,并且包含了各種中間件接口,可以靈活的完成各種需求。整體架構(gòu)如下圖所示:

Python爬蟲(chóng)框架Scrapy實(shí)戰(zhàn)之批量抓取招聘信息

    綠線是數(shù)據(jù)流向,首先從初始URL 開(kāi)始,Scheduler 會(huì)將其交給 Downloader 進(jìn)行下載,下載之后會(huì)交給 Spider 進(jìn)行分析,Spider分析出來(lái)的結(jié)果有兩種:一種是需要進(jìn)一步抓取的鏈接,例如之前分析的“下一頁(yè)”的鏈接,這些東西會(huì)被傳回 Scheduler ;另一種是需要保存的數(shù)據(jù),它們則被送到Item Pipeline 那里,那是對(duì)數(shù)據(jù)進(jìn)行后期處理(詳細(xì)分析、過(guò)濾、存儲(chǔ)等)的地方。另外,在數(shù)據(jù)流動(dòng)的通道里還可以安裝各種中間件,進(jìn)行必要的處理。

我假定你已經(jīng)安裝了Scrapy。假如你沒(méi)有安裝,你可以參考這篇文章。

在本文中,我們將學(xué)會(huì)如何使用Scrapy建立一個(gè)爬蟲(chóng)程序,并爬取指定網(wǎng)站上的內(nèi)容

1. 創(chuàng)建一個(gè)新的Scrapy Project
2. 定義你需要從網(wǎng)頁(yè)中提取的元素Item
3.實(shí)現(xiàn)一個(gè)Spider類,通過(guò)接口完成爬取URL和提取Item的功能
4. 實(shí)現(xiàn)一個(gè)Item PipeLine類,完成Item的存儲(chǔ)功能

我將會(huì)用騰訊招聘官網(wǎng)作為例子。
Github源碼:https://github.com/maxliaops/scrapy-itzhaopin

Python爬蟲(chóng)框架Scrapy實(shí)戰(zhàn)之批量抓取招聘信息

目標(biāo):抓取騰訊招聘官網(wǎng)職位招聘信息并保存為JSON格式。

新建工程

首先,為我們的爬蟲(chóng)新建一個(gè)工程,首先進(jìn)入一個(gè)目錄(任意一個(gè)我們用來(lái)保存代碼的目錄),執(zhí)行:

 

復(fù)制代碼代碼如下:

scrapy startprojectitzhaopin

 

最后的itzhaopin就是項(xiàng)目名稱。這個(gè)命令會(huì)在當(dāng)前目錄下創(chuàng)建一個(gè)新目錄itzhaopin,結(jié)構(gòu)如下:

├── itzhaopin
│   ├── itzhaopin
│   │   ├── __init__.py
│   │   ├── items.py
│   │   ├── pipelines.py
│   │   ├── settings.py
│   │   └── spiders
│   │      └── __init__.py
│   └── scrapy.cfg

scrapy.cfg: 項(xiàng)目配置文件
items.py: 需要提取的數(shù)據(jù)結(jié)構(gòu)定義文件
pipelines.py:管道定義,用來(lái)對(duì)items里面提取的數(shù)據(jù)做進(jìn)一步處理,如保存等
settings.py: 爬蟲(chóng)配置文件
spiders: 放置spider的目錄

定義Item

在items.py里面定義我們要抓取的數(shù)據(jù):

 

復(fù)制代碼代碼如下:

from scrapy.item import Item, Field  
class TencentItem(Item):  
    name = Field()                # 職位名稱  
    catalog = Field()             # 職位類別  
    workLocation = Field()        # 工作地點(diǎn)  
    recruitNumber = Field()       # 招聘人數(shù)  
    detailLink = Field()          # 職位詳情頁(yè)鏈接  
    publishTime = Field()         # 發(fā)布時(shí)間  

 

實(shí)現(xiàn)Spider

Spider是一個(gè)繼承自scrapy.contrib.spiders.CrawlSpider的Python類,有三個(gè)必需的定義的成員

name: 名字,這個(gè)spider的標(biāo)識(shí)

start_urls:一個(gè)url列表,spider從這些網(wǎng)頁(yè)開(kāi)始抓取

parse():一個(gè)方法,當(dāng)start_urls里面的網(wǎng)頁(yè)抓取下來(lái)之后需要調(diào)用這個(gè)方法解析網(wǎng)頁(yè)內(nèi)容,同時(shí)需要返回下一個(gè)需要抓取的網(wǎng)頁(yè),或者返回items列表

所以在spiders目錄下新建一個(gè)spider,tencent_spider.py:

 

復(fù)制代碼代碼如下:

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的規(guī)則  
        Rule(sle(allow=("/position.php/?&start=/d{,4}#a")), follow=True, callback='parse_item')  
    ]  
    def parse_item(self, response): # 提取數(shù)據(jù)到Items里面,主要用到XPath和CSS選擇器提取網(wǎng)頁(yè)數(shù)據(jù)  
        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  

 

實(shí)現(xiàn)PipeLine

PipeLine用來(lái)對(duì)Spider返回的Item列表進(jìn)行保存操作,可以寫(xiě)入到文件、或者數(shù)據(jù)庫(kù)等。

PipeLine只有一個(gè)需要實(shí)現(xiàn)的方法:process_item,例如我們將Item保存到JSON格式文件中:

pipelines.py

 

復(fù)制代碼代碼如下:

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(  
)  

 

到現(xiàn)在,我們就完成了一個(gè)基本的爬蟲(chóng)的實(shí)現(xiàn),可以輸入下面的命令來(lái)啟動(dòng)這個(gè)Spider

scrapy crawl tencent

爬蟲(chóng)運(yùn)行結(jié)束后,在當(dāng)前目錄下將會(huì)生成一個(gè)名為tencent.json的文件,其中以JSON格式保存了職位招聘信息。
部分內(nèi)容如下:

{"recruitNumber": ["1"], "name": ["SD5-資深手游策劃(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15626&keywords=&tid=0&lid=0", "publishTime":
["2014-04-25"], "catalog": ["產(chǎn)品/項(xiàng)目類"], "workLocation": ["深圳"]}

{"recruitNumber": ["1"], "name": ["TEG13-后臺(tái)開(kāi)發(fā)工程師(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15666&keywords=&tid=0&lid=0", 
"publishTime": ["2014-04-25"], "catalog": ["技術(shù)類"], "workLocation": ["深圳"]}

{"recruitNumber": ["2"], "name": ["TEG12-數(shù)據(jù)中心高級(jí)經(jīng)理(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15698&keywords=&tid=0&lid=0", 
"publishTime": ["2014-04-25"], "catalog": ["技術(shù)類"], "workLocation": ["深圳"]}

{"recruitNumber": ["1"], "name": ["GY1-微信支付品牌策劃經(jīng)理(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15710&keywords=&tid=0&lid=0", 
"publishTime": ["2014-04-25"], "catalog": ["市場(chǎng)類"], "workLocation": ["深圳"]}

{"recruitNumber": ["2"], "name": ["SNG06-后臺(tái)開(kāi)發(fā)工程師(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15499&keywords=&tid=0&lid=0",
"publishTime": ["2014-04-25"], "catalog": ["技術(shù)類"], "workLocation": ["深圳"]}

{"recruitNumber": ["2"], "name": ["OMG01-騰訊時(shí)尚視頻策劃編輯(北京)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15694&keywords=&tid=0&lid=0", 
"publishTime": ["2014-04-25"], "catalog": ["內(nèi)容編輯類"], "workLocation": ["北京"]}

{"recruitNumber": ["1"], "name": ["HY08-QT客戶端Windows開(kāi)發(fā)工程師(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=11378&keywords=&tid=0&lid=0", 
"publishTime": ["2014-04-25"], "catalog": ["技術(shù)類"], "workLocation": ["深圳"]}

{"recruitNumber": ["5"], "name": ["HY1-移動(dòng)游戲測(cè)試經(jīng)理(上海)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15607&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["技術(shù)類"], "workLocation": ["上海"]}

{"recruitNumber": ["1"], "name": ["HY6-網(wǎng)吧平臺(tái)高級(jí)產(chǎn)品經(jīng)理(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=10974&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["產(chǎn)品/項(xiàng)目類"], "workLocation": ["深圳"]}

{"recruitNumber": ["4"], "name": ["TEG14-云存儲(chǔ)研發(fā)工程師(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15168&keywords=&tid=0&lid=0", "publishTime": ["2014-04-24"], "catalog": ["技術(shù)類"], "workLocation": ["深圳"]}

{"recruitNumber": ["1"], "name": ["CB-薪酬經(jīng)理(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=2309&keywords=&tid=0&lid=0", "publishTime": ["2013-11-28"], "catalog": ["職能類"], "workLocation": ["深圳"]}

以上全部?jī)?nèi)容就是通過(guò)Python爬蟲(chóng)框架Scrapy實(shí)戰(zhàn)之批量抓取招聘信息的全部?jī)?nèi)容,希望對(duì)大家有所幫助,欲了解更多編程知識(shí),請(qǐng)鎖定我們的網(wǎng)站,每天都有新的內(nèi)容發(fā)布。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 松江区| 库伦旗| 桐城市| 张家港市| 饶河县| 金沙县| 溧阳市| 宝丰县| 汝南县| 马关县| 光山县| 托克逊县| 德格县| 中山市| 罗城| 大足县| 辽阳县| 天门市| 易门县| 疏勒县| 大港区| 莫力| 台南县| 河北省| 兴文县| 澄江县| 安徽省| 虞城县| 娄底市| 独山县| 龙里县| 济南市| 乐东| 乐平市| 丹巴县| 勃利县| 商河县| 凤城市| 田阳县| 亳州市| 杭锦后旗|