First:创建项目:执行下面三句命令:
1、 scrapy startproject zhilianzhaopin
2、 cd zhilianzhaopin
3、scrapy genspider zhilian www.zhaopin.com
项目已经创建完毕,话不多说,开始我的表演:
由于智联招聘的数据是动态加载的,所以,先来寻找路由吧……
上图绿色框里的URL并不是我们想要的,得不到我们想要的数据,F12 打开Natework看看里面的ajax请求,一个一个的找,有点耐心,
结果发现红色框里的URL,这才是我们真正想要的URL,里面才是我们想要的数据,复制该路由浏览器打开,你会看到下图:
这才是我们想要的数据,是json格式的数据。
然后我们打开第二页,第三页,把各自URL拿出来,仔细看,可以发现URL的变化是有规律的,所有的参数都不变,只有一个参数改变,那就是 start的参数,第一页是0,第二页是90,第三页是180,好了,URL找对了,那代码就简单了,最重要的是有耐心!!!
import scrapy
import json
from zhilianzhaopin.items import ZhilianzhaopinItem
from urllib.parse import urlencode #(这个包是为了拼接下面的URL)
class ZhilianSpider(scrapy.Spider):
name = 'zhilian'
# allowed_domains = ['www.zhaopin.com']
# 爬虫最重要的就是找到正确的URL,一定要认真仔细一点,尤其是动态的获取数据
start_urls = ['https://fe-api.zhaopin.com/c/i/sou?']
def start_requests(self):
# 定义一个循环 range(a,b,c)里的三个参数 都必须是正整数,a代表起始位置,b代表是结束位置,c代表的是步长
# 原路由里的参数很多,其实大部分都是没用的,就是来迷惑你的,要有耐心的找到真正有用的参数
for i in range(0,10,90):
start = str(i)
ing = {
"start":start,
"pageSize":"90",
"cityId":"538",
"kw":"Python",
"kt":'3'
}
for url in self.start_urls:
new_url = url + urlencode(ing) # 拼接URL
yield scrapy.Request(url=new_url, callback=self.parse)
def parse(self, response):
# 转换一下数据格式
response = json.loads(response.text)
# 取出里面的数据 里面的数据都是以字典的方式存放的,所有我们用键来去值
result = response['data']['results']
for i in result:
item = ZhilianzhaopinItem()
#高级Python开发工程师 - -抖音上海
# 工作名字
jobname = i['jobName']
# 公司名字 北京字节跳动科技有限公司
company_name = i['company']['name']
# 工资
welfare = i['welfare']
#print(welfare) #['五险一金', '绩效奖金', '交通补助', '带薪年假', '弹性工作']
if welfare: #有的数据是空的,要判断一下
item['welfare'] = "".join(welfare)
else:
item['welfare'] = ""
# 工资
salary = i['salary']
# 公司详情页路由,为了取到公司的地址,在一级页面里是没有的,得请求二级页面
url = i['company']['url']
# https: // company.zhaopin.com / CZ439765920.html
item['jobname'] = jobname
item['company_name'] = company_name
item['salary'] = salary
# 发送二级页面请求,重写方法,把item对象也要给传递过去,
yield scrapy.Request(url=url, callback=self.get_detail,meta={'item':item})
def get_detail(self,response):
# 得到Item对象
item = response.meta['item']
company_address = response.xpath('//div[@class="map-box"]/p/span/text()').extract_first()
if company_address: #有的数据是空的,所以判断一下
item['company_address'] = company_address
else:
item['company_address'] = "暂时没有提供地址!!!"
yield item
zhilian.py 源代码 结束!!!
import scrapy
class ZhilianzhaopinItem(scrapy.Item):
# define the fields for your item here like:
jobname = scrapy.Field()
company_name= scrapy.Field()
salary = scrapy.Field()
welfare = scrapy.Field()
company_address = scrapy.Field()
items.py 源代码 结束!!!
# 导入模块
import pymysql
class ZhilianzhaopinPipeline(object):
conn = None #定义连接
mycursor = None #定义游标
def open_spider(self,spider):
# 连接自己的数据库,用前面定义的变量接受一下,连接的前提是你得在数据库里建立数据库和数据表
self.conn = pymysql.connect(host="127.0.0.1",user="root",password="962464",port=3306,db="scrapy")
def process_item(self, item, spider):
# 获取一下游标
self.mycursor = self.conn.cursor()
# 编写sql语句
sql = "insert into zhilian(jobname,company_name,salary,welfare,company_address) values ('%s','%s','%s','%s','%s')"%(item['jobname'],item['company_name'],item['salary'],item['welfare'],item['company_address'])
# 执行sql语句
self.mycursor.execute(sql)
self.conn.commit()
print("插入成功一条数据……")
return item
def close_spider(self, spider):
# 关闭游标
self.mycursor.close()
# 断开连接
self.conn.close()
import json
# 以json的格式存储到文件中
class ZhilianPipeline(object):
f = None
list1 = [] #定义一个列表
def open_spider(self,spider):
print("开始爬虫……")
# 打开文件(这里只打开一次,也就是说只运行一次)
self.f = open('zhilian.json','w',encoding='utf-8')
def process_item(self, item, spider):
print("正在写入……")
# 定义一个字典
dict = {
"jobname":item['jobname'],
"company_name":item['company_name'],
"salary":item['salary'],
'welfare':item['welfare'],
'company_address':item['company_address']
}
# 把每一个字典都加入到列表中
self.list1.append(dict)
return item
def close_spider(self,spider):
# 把列表序列化一下,转换为json格式的字符串
ang = json.dumps(self.list1)
# 一次性全部写入文件
self.f.write(ang)
print("结束爬虫……")
self.f.close()
管道文件 pipelines.py 源代码 结束!!!
当然了,settings.py 就简单多了,,,别忘了,打开管道文件的开关,
ITEM_PIPELINES = {
'zhilianzhaopin.pipelines.ZhilianzhaopinPipeline': 400,
'zhilianzhaopin.pipelines.ZhilianPipeline': 300,
}
修改robots协议,伪装浏览器访问:
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
好了,全部代码到此结束,那里有错的,给我留言,我会第一时间内回复,当然了,就得可以的点个赞,转发一下,谢谢!!!
再见!!!