python-scrapy爬取某招聘网站信息(一)
2024-08-31 22:03:03
首先准备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。。。
最新文章
- swt controls里的控件list
- getContentResolver()内容解析者查询联系人、插入联系人
- Chrome Restful Api 测试工具 Postman-REST-Client离线安装包下载,Axure RP Extension for Chrome离线版下载
- 【BZOJ】1202: [HNOI2005]狡猾的商人(并查集+前缀和)
- React笔记_(5)_react语法4
- Pre-Query trigger in Oracle D2k / Oracle Forms
- SQL Server中查询结果拼接遇到的小问题
- IOS 7 Study - UIViewController
- Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
- git的使用与积累
- tnvm 安装模块不能找到关联模块问题
- 图片切换效果,纯js
- 多元线性相关Matlab代码
- Gulp安装流程、使用方法及cmd常用命令导览
- Struts2 转换器
- android studio比较长用的几款插件
- 总结AWS使用要点
- solr7.7.0搜索引擎使用(一)(下载安装)
- CSDN也有我的博客啦
- faiss CPU版本+GPU版本安装
热门文章
- 第8.30节 重写Python __setattr__方法实现属性修改捕获
- PyQt(Python+Qt)学习随笔:QTreeWidget中给树型部件增加顶层项的方法
- 第12.4节 Python伪随机数数生成器random模块导览
- windows cmd 链接远程mysql服务器
- baby sqli 联合查询加入数据 手工注入
- element ui中表单循环项的校验
- Shell:子shell概念
- 深入理解Java虚拟机(三)——垃圾回收策略
- 5+App 相关记录
- PDCA