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

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找对了,那代码就简单了,最重要的是有耐心!!!

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

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

Items.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 源代码 结束!!!

管道文件 pipelines.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

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

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用Scrapy框架爬取我爱我家网站数据,并将数据存入数据库,可以按照以下步骤进行操作: 1. 首先,创建Scrapy项目。在命令行中执行以下命令来创建一个新的Scrapy项目: scrapy startproject woaiwojia 2. 进入项目的根目录,并创建一个名为spiders的文件夹,用于存放爬虫文件。运行以下命令: cd woaiwojia mkdir spiders 3. 在spiders文件夹中创建一个名为woaiwojia_spider.py的文件,用于编写爬虫代码。 4. 打开woaiwojia_spider.py文件,并导入所需库和模块: import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule import pymongo 5. 在woaiwojia_spider.py文件中,创建一个名为WoaiwojiaSpider的类,并继承CrawlSpider类: class WoaiwojiaSpider(CrawlSpider): name = 'woaiwojia' allowed_domains = ['woaiwojia.com'] start_urls = ['http://www.woaiwojia.com'] 6. 在WoaiwojiaSpider类中,定义rules列表,用于配置爬取规则: rules = ( Rule(LinkExtractor(allow=r'/\d+\.html'), callback='parse_item', follow=True), ) 7. 在WoaiwojiaSpider类中,定义parse_item方法,用于解析爬取到的数据,并存入数据库: def parse_item(self, response): # 解析数据逻辑,获取需要的数据 item = {} item['title'] = response.xpath('//title/text()').extract_first() item['content'] = response.xpath('//p/text()').extract_first() # 连接数据库存储数据 client = pymongo.MongoClient('mongodb://localhost:27017/') db = client['woaiwojia'] collection = db['data'] collection.insert_one(item) return item 8. 在命令行中执行以下命令来启动爬虫scrapy crawl woaiwojia 以上就是使用Scrapy框架爬取我爱我家网站数据存入数据库的基本步骤,可以根据实际情况进行相应的修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值