一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python爬蟲框架Scrapy實戰之批量抓取招聘信息

Python爬蟲框架Scrapy實戰之批量抓取招聘信息

2020-07-29 11:55HanTangSongMing Python

網絡爬蟲又被稱為網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱為網頁追逐者,是按照一定的規則,自動抓取萬維網信息的程序或者腳本。這篇文章主要介紹Python爬蟲框架Scrapy實戰之批量抓取招聘信息,有需要的朋友可以參

網絡爬蟲抓取特定網站網頁的html數據,但是一個網站有上千上萬條數據,我們不可能知道網站網頁的url地址,所以,要有個技巧去抓取網站的所有html頁面。Scrapy是純Python實現的爬蟲框架,用戶只需要定制開發幾個模塊就可以輕松的實現一個爬蟲,用來抓取網頁內容以及各種圖片,非常之方便~

   Scrapy 使用wisted這個異步網絡庫來處理網絡通訊,架構清晰,并且包含了各種中間件接口,可以靈活的完成各種需求。整體架構如下圖所示:

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格式。

新建工程

首先,為我們的爬蟲新建一個工程,首先進入一個目錄(任意一個我們用來保存代碼的目錄),執行:

 

復制代碼 代碼如下:

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里面定義我們要抓取的數據:

?
1
2
3
4
5
6
7
8
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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-后臺開發工程師(深圳)"], "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-后臺開發工程師(深圳)"], "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-QT客戶端Windows開發工程師(深圳)"], "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-云存儲研發工程師(深圳)"], "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": ["深圳"]}

以上全部內容就是通過Python爬蟲框架Scrapy實戰之批量抓取招聘信息的全部內容,希望對大家有所幫助,欲了解更多編程知識,請鎖定我們的網站,每天都有新的內容發布。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩一区二区在线视频 | 91精品导航在线观看 | 奇米狠狠色 | 99re5精品视频在线观看 | 蜜桃成人影院 | 四虎免费在线观看 | 性派对videos18party | www.5151淫| 扒开女人下面使劲桶屁股动漫 | 午夜DY888国产精品影院 | 毛片免费视频观看 | 日本在线www | 欧美久草在线 | 特黄特黄aaaa级毛片免费看 | 亚洲精品中文字幕久久久久久 | 日本三级免费看 | 欧美在线视频一区二区 | 小早川怜子息梦精在线播放 | 双性np肉文 | 12345国产精品高清在线 | 97就去干 | 唯美清纯 自拍偷 | 国产尤物精品视频 | 国产欧美一区二区三区免费看 | 娇小性色 | 99精品视频在线观看免费播放 | 成人丁香婷婷 | bestialitysex杂交| 亚洲国产日韩成人综合天堂 | 午夜影院免费体验 | 精品一区二区三区高清免费观看 | 蜜桃视频一区二区 | 国产人妖ts在线视频网 | 肉文np高h| 欧美日韩一区不卡 | 亚洲 欧美 成人 | 久久久久激情免费观看 | 国产精品秒播无毒不卡 | 欧美伊香蕉久久综合类网站 | 男人吃奶动态图 | 成人日批视频 |