100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Python爬虫 scrapy框架 爬取智联招聘 并把数据存入数据库 存为json格式的数据

Python爬虫 scrapy框架 爬取智联招聘 并把数据存入数据库 存为json格式的数据

时间:2022-04-22 22:40:58

相关推荐

Python爬虫 scrapy框架 爬取智联招聘 并把数据存入数据库 存为json格式的数据

First:创建项目:执行下面三句命令:

1、 scrapy startproject zhilianzhaopin2、 cd zhilianzhaopin3、scrapy genspider zhilian

项目已经创建完毕,话不多说,开始我的表演:

由于智联招聘的数据是动态加载的,所以,先来寻找路由吧……

上图绿色框里的URL并不是我们想要的,得不到我们想要的数据,F12 打开Natework看看里面的ajax请求,一个一个的找,有点耐心,

结果发现红色框里的URL,这才是我们真正想要的URL,里面才是我们想要的数据,复制该路由浏览器打开,你会看到下图:

这才是我们想要的数据,是json格式的数据。

然后我们打开第二页,第三页,把各自URL拿出来,仔细看,可以发现URL的变化是有规律的,所有的参数都不变,只有一个参数改变,那就是 start的参数,第一页是0,第二页是90,第三页是180,好了,URL找对了,那代码就简单了,最重要的是有耐心!!!

爬虫文件代码:zhilian.py 源代码开始:

import scrapyimport jsonfrom zhilianzhaopin.items import ZhilianzhaopinItemfrom urllib.parse import urlencode #(这个包是为了拼接下面的URL)class ZhilianSpider(scrapy.Spider):name = 'zhilian'# allowed_domains = ['']# 爬虫最重要的就是找到正确的URL,一定要认真仔细一点,尤其是动态的获取数据start_urls = ['https://fe-/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) # 拼接URLyield 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: // / CZ439765920.htmlitem['jobname'] = jobnameitem['company_name'] = company_nameitem['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_addresselse:item['company_address'] = "暂时没有提供地址!!!"yield item

zhilian.py 源代码 结束!!!

Items.py 定义存入数据库的字段名 源代码开始:

import scrapyclass 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 源代码 结束!!!

管道文件 pipelines.py 源代码—开始:

# 导入模块import pymysqlclass 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)mit()print("插入成功一条数据……")return itemdef close_spider(self, spider):# 关闭游标self.mycursor.close()# 断开连接self.conn.close()import json# 以json的格式存储到文件中class ZhilianPipeline(object):f = Nonelist1 = [] #定义一个列表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 itemdef 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 rulesROBOTSTXT_OBEY = False

好了,全部代码到此结束,那里有错的,给我留言,我会第一时间内回复,当然了,就得可以的点个赞,转发一下,谢谢!!!

再见!!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。