目標:通過職友集,搜索全國上百家招聘網站的最新職位。並將【公司、職位、地址、招聘信息】存儲成csv文件。
網址:https://www.jobui.com/rank/company/
1、輸入創建Scrapy項目的命令:scrapy startproject jobui
在終端輸入命令scrapy startproject jobui後會出現以下結果
終端:
文件夾:
2、在spiders文件夾下新建一個jobui_jobs.py文件
jobui_jobs.py程序
import scrapy
import bs4
from ..items import JobuiItem
class JobuiSpider(scrapy.Spider):
name = 'jobs'
allowed_domins = ['https://www.jobui.com']
start_urls = ['https://www.jobui.com/rank/company/']
def parse(self,response):
bs = bs4.BeautifulSoup(response.text,'html.parser')
data_list = bs.find_all('ul',class_="textList flsty cfix")
for data_1 in data_list:
a_list = data_1.find_all('a')
for a in a_list:
company_id = a['href']
real_url = 'https://www.jobui.com' + company_id + 'jobs'
yield scrapy.Request(real_url,callback = self.parse_job)
def parse_job(self,response):
bs = bs4.BeautifulSoup(response.text,'html.parser')
company = bs.find('h1',id='companyH1')['data-companyname']
datas = bs.find_all('div',class_="job-simple-content")
for data in datas:
item = JobuiItem()
item['company'] = company
item['position'] = data.find('h3').text
item['address'] = data.find_all('span')[0].text
item['detail'] = data.find_all('span')[1].text
yield item
3、items.py程序
import scrapy
class JobuiItem(scrapy.Item):
# define the fields for your item here like:
company = scrapy.Field()
position = scrapy.Field()
address = scrapy.Field()
detail = scrapy.Field()
4、pipelines.py程序
# 存儲爲Excel文件,我們依舊是用openpyxl模塊來實現
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
import openpyxl
class JobuiPipeline(object):
def __init__(self):
#初始化函數 當類實例化時這個方法會自啓動
self.wb = openpyxl.Workbook() # 創建工作簿
self.ws = self.wb.active # 定位活動表
self.ws.append(['公司','職位','地址','招聘信息',''])
def process_item(self, item, spider):
#process_item是默認的處理item的方法,就像parse是默認處理response的方法
company_datas = [item['company'],item['position'],item['address'],item['detail']]
self.ws.append(company_datas)
#把公司名稱、職位名稱、工作地點和招聘要求都寫成列表的形式,賦值給line
return item
def close_spider(self,spider):
self.wb.save('./jobui.xlsx')
self.wb.close()
5、settings.py程序
BOT_NAME = 'jobui'
SPIDER_MODULES = ['jobui.spiders']
NEWSPIDER_MODULE = 'jobui.spiders'
# USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.3'
ROBOTSTXT_OBEY = False
# 下載延遲0.5秒
DOWNLOAD_DELAY = 0.5
# 存儲成Excel文件的方法要稍微複雜一些,我們需要先在setting.py裏設置啓用ITEM_PIPELINES
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'jobui.pipelines.JobuiPipeline': 300,
}
FEED_URI = './storage/data/%(name)s.csv'
# FEED_URI是導出文件的路徑。'./storage/data/%(name)s.csv',就是把存儲的文件放到與settings.py文件同級的storage文件夾的data子文件夾裏。
FEED_FORMAT = 'CSV'
# FEED_FORMAT 是導出數據格式,寫CSV就能得到CSV格式。
FEED_EXPORT_ENCODING = 'ansi'
# FEED_EXPORT_ENCODING 是導出文件編碼,ansi是一種在windows上的編碼格式
6、在jobui文件夾下添加main.py文件
main.py程序
from scrapy import cmdline
cmdline.execute(['scrapy','crawl','jobs'])
7、運行main.py文件
得到以下表格:
個人說明:
我在學習這一關的過程中,由於進入鏈接後出現的界面以及Elements中各項信息的元素、屬性都與教程中的有區別,因此我原來的程序一直出現各種錯誤,並且一直不能將我爬取的信息下載csv文件中。即使我直接copy教程中的所有程序並且載程序沒報錯的情況下,依然不能得到我所需要的信息,csv文件一直都是隻有表頭【公司、職位、地址、招聘信息】這幾個。
我嘗試了上網查找其他人的答案,但是他們的程序還是不能解決我的問題(其實我也就只看了兩篇博客)。我花了一天時間去搞清楚整個項目,終於最後得到了我想要的以上那個表格。
以下是【教程中的操作】和【我的操作】的區別
原教程中,【公司、職位、地址、招聘信息】這幾個信息的Elements元素、屬性如下所示:
公司:
職位、地址、招聘信息:
以下是教程中【公司、職位、地址、招聘信息】這幾個信息的Elements元素、屬性的總結:
而我找到的【公司、職位、地址、招聘信息】幾個信息的Elements元素、屬性如下所示:
公司:
職位、地址、招聘信息:
以下是我找到的【公司、職位、地址、招聘信息】這幾個信息的Elements元素、屬性的總結:
數據 | 元素 | 屬性 |
---|---|---|
公司名稱 | h1 | id='companyH1' |
職位名稱 | h3 | 純文本 |
工作地點 | span(第0個元素) | 純文本 |
招聘要求 | span(第1個元素) | 純文本 |