首先准备python3+scrapy+mysql+pycharm。。。

这次我们选择爬取智联招聘网站的企业招聘信息,首先我们有针对的查看网站的html源码,发现其使用的是js异步加载的方式,直接从服务端调取json数据,这就意味着我们用地址栏的网址获取的网站内容是不全的,无法获得想要的数据。

那么我们用什么方式获取想要的数据呢,正所谓道高一尺魔高一丈,有反爬虫就有范反爬虫,当然我们不用那么麻烦,通过分析页面的加载有针对性的抓包获取信息进行分析,我们会发现每次刷新或者搜索页面时候,除了会加载许多图片、广告等信息外,还加载了一个包,这个包里就有我们想要的所有信息,并且服务端都给我们打包成json格式了,这样看似复杂,实则简化了我们对数据进行过滤的步骤。

直接从头文件中找到请求的url源头,那么就能直接获取json数据了。 怎么样是不是感受到了世界的友好呢?

分析完毕,接下来就可以编写爬虫数据了。。。

一、创建爬虫项目

在命令行中在指定的目录创建爬虫项目

scrapy startproject zhilian

然后就是创建爬虫文件

scrapy genspider zhaopin "sou.zhaopin.com"  
#要把http://www去掉因为爬虫项目运行时会自动加上,这里也是为了避免不必要的错误

二、编写程序

首先编写item文件,我们有选择的爬取几个关键数据

import scrapy

class ZhilianItem(scrapy.Item):
# 岗位名称
jobName = scrapy.Field()
# 公司名称
companyName = scrapy.Field()
# 工作地点
workSite = scrapy.Field()
# 更新日期
updateDate = scrapy.Field()
# 薪资水平
salaryLevel = scrapy.Field()
# 岗位关键词
jobKeyWord = scrapy.Field()

然后就是编写爬虫文件了我们的命名为zhaopin.py

# -*- coding: utf-8 -*-
import json import scrapy
from zhilian.items import ZhilianItem class zhaopinSpider(scrapy.Spider):
name = 'javaDevelop'
allowed_domains = ['sou.zhaopin.com']
offset = 0
url1 = "https://fe-api.zhaopin.com/c/i/sou?start="
url2 = "&pageSize=90&cityId=530&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=%E7%BB%8F%E6%B5%8E&kt=3"
start_urls = (
url1 + str(offset) + url2,  #此为我们简化后的网址,网址的规律相当简单,简单试试就找到规律了
) print(start_urls)
def parse(self, response):for flag in range(0, 90):
item = ZhilianItem()
job = json.loads(response.text)['data']['results'][flag] # 岗位名称
item['jobName'] = job['jobName']
# 公司名称
item['companyName'] = job['company']['name']
# 工作地点
item['workSite'] = job['city']['display']
# 更新日期
item['updateDate'] = job['updateDate']
# 薪资水平
item['salaryLevel'] = job['salary']
# 岗位关键词
item['jobKeyWord'] = job['welfare']
yield item if self.offset < 450:
self.offset += 90
yield scrapy.Request(self.url1 + str(self.offset) + self.url2, callback=self.parse, dont_filter=True)
       #dont_filter=True这个参数相当重要,指不过滤url直接爬取。否则你会发现你的爬虫爬取完第一页后就不会再爬取了,这样是因为url与爬取域url不符,爬虫自动认为爬取结束

接下来就是写管道文件了,这里我用了两种方式,一种是写到数据库中,还有一种是写道本地txt文件中

import pymysql

class zhaoPipeline(object):
def __init__(self):
self.conn = pymysql.connect(host='172.18.96.151', user='root',
password='123456', db='zhilian', charset='utf8'
)
self.cur = self.conn.cursor() def process_item(self, item, spider):
# 岗位名称
jobName = item['jobName']
# 公司名称
companyName = item['companyName']
# 工作地点
workSite = item['workSite']
# 官网链接
updateDate = item['updateDate']
# 薪资水平
salaryLevel = item['salaryLevel']
# 岗位关键词
jobKeyWord = item['jobKeyWord']
data = [jobName, companyName, workSite, updateDate, salaryLevel, ','.join(jobKeyWord)]
print(data)
print("======================================")
sql = """
insert into zhaopin (jobname,companyname,worksite,updatedate,salarylevel,jobkeyword) values
(%s,%s,%s,%s,%s,%s)
"""
# self.conn.ping(reconnect=True)
self.cur.execute(sql, data)
self.conn.commit() def close_spider(self, spider):
self.cur.close()
self.conn.close() class ZhilianPipeline(object):
def __init__(self):
self.filename = open("java.txt", 'wb')
# self.path = "G:\images\p"
# if not os.path.exists(self.path):
# os.mkdir(self.path) def process_item(self, item, spider):
# 岗位名称
jobName = item['jobName']
# 公司名称
companyName = item['companyName']
# 工作地点
workSite = item['workSite']
# 官网链接
updateDate = item['updateDate']
# 薪资水平
salaryLevel = item['salaryLevel']
# 岗位关键词
jobKeyWord = item['jobKeyWord'] self.filename.write(jobName.encode('utf-8') + ' '.encode('utf-8')
+ companyName.encode('utf-8') + ' '.encode('utf-8')
+ workSite.encode('utf-8') + ' '.encode('utf-8')
+ updateDate.encode('utf-8') + ' '.encode('utf-8')
+ salaryLevel.encode('utf-8') + ' '.encode('utf-8')
+ ','.join(jobKeyWord).encode('utf-8') + '\n'.encode('utf-8'))
return item def close_spider(self, spider):
self.filename.close()

手把手教学,我们附上建立库语句

create table zhaopin
(id int(10) not null primary key AUTO_INCREMENT,
jobname varchar(40),
companyname varchar(20),
worksite varchar(10),
updatedate datetime,
salarylevel varchar(10),
jobkeyword varchar(40)
);

然后就剩下最后的设置setting了,下面三个关键的地方要改

ROBOTSTXT_OBEY = False

DEFAULT_REQUEST_HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36',
# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
# 'Accept-Language': 'en',
}

ITEM_PIPELINES = {
'zhilian.pipelines.ZhilianPipeline': 300,
'zhilian.pipelines.zhaoPipeline': 200,
}

三、运行爬虫

scrapy crawl zhaopin

等待片刻,刷新数据表

OVER。。。

最新文章

  1. swt controls里的控件list
  2. getContentResolver()内容解析者查询联系人、插入联系人
  3. Chrome Restful Api 测试工具 Postman-REST-Client离线安装包下载,Axure RP Extension for Chrome离线版下载
  4. 【BZOJ】1202: [HNOI2005]狡猾的商人(并查集+前缀和)
  5. React笔记_(5)_react语法4
  6. Pre-Query trigger in Oracle D2k / Oracle Forms
  7. SQL Server中查询结果拼接遇到的小问题
  8. IOS 7 Study - UIViewController
  9. Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
  10. git的使用与积累
  11. tnvm 安装模块不能找到关联模块问题
  12. 图片切换效果,纯js
  13. 多元线性相关Matlab代码
  14. Gulp安装流程、使用方法及cmd常用命令导览
  15. Struts2 转换器
  16. android studio比较长用的几款插件
  17. 总结AWS使用要点
  18. solr7.7.0搜索引擎使用(一)(下载安装)
  19. CSDN也有我的博客啦
  20. faiss CPU版本+GPU版本安装

热门文章

  1. 第8.30节 重写Python __setattr__方法实现属性修改捕获
  2. PyQt(Python+Qt)学习随笔:QTreeWidget中给树型部件增加顶层项的方法
  3. 第12.4节 Python伪随机数数生成器random模块导览
  4. windows cmd 链接远程mysql服务器
  5. baby sqli 联合查询加入数据 手工注入
  6. element ui中表单循环项的校验
  7. Shell:子shell概念
  8. 深入理解Java虚拟机(三)——垃圾回收策略
  9. 5+App 相关记录
  10. PDCA