spider小白-初探Scrapy

本文介绍Scrapy框架的基本使用方法,包括项目的创建、配置、爬虫编写及数据存储等环节,并以智联招聘信息抓取为例进行详细说明。

Scrapy框架可以帮我们处理一部分事情,从而减轻我们的负担。更重要的是,Scrapy框架使用了异步的模式可以加快下载速度,而自己手动实现异步模式是十分麻烦的事情。

Scrapy框架的安装就不提了,下面演示怎么生产Scrapy项目。
这里写图片描述
然后使用pycharm打开生成的项目zhilianproject,工程目录如下:
这里写图片描述
其中myRedisCommand.py mySqlCommand.py zhilianSpider.py entrypoint.py是后面添加的

但这样我们还是再pycharm中无法进行调试,所以我们在添加entrypoint.py文件,该文件中的代码如下:

from scrapy.cmdline import execute
execute(['scrapy','crawl','zhilianSpider'])

其中zhilianSpider是真正的爬虫文件名

再开始写代码前,我们需要对Scrapy框架有个基本的了解:
这里写图片描述
Scrapy Engine: 这是引擎,负责Spiders、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等等!(像不像人的身体?)

Scheduler(调度器): 它负责接受引擎发送过来的requests请求,并按照一定的方式进行整理排列,入队、并等待Scrapy Engine(引擎)来请求时,交给引擎。

Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spiders来处理,

Spiders:它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),

Item Pipeline:它负责处理Spiders中获取到的Item,并进行处理,比如去重,持久化存储(存数据库,写入文件,总之就是保存数据用的)

Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件

Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spiders中间‘通信‘的功能组件(比如进入Spiders的Responses;和从Spiders出去的Requests)

接下来需要做三件事:
第一件事:再items.py中定义一些字段,这些字段临时存放你需要存储的数据,方便之后进行持久化存储
第二件事:再spiders文件夹中编写自己的爬虫
第三件事:再pipelines.py中存储自己的数据

第一件事:
根据自己需要的提取的内容来定义,通过以智联招聘的信息为例:
职位名称 职位链接 反馈率 公司名称 职位月薪 工作地点 发布日期

import scrapy


class ZhilianprojectItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 职位名称
    zwmc = scrapy.Field()
    # 职位链接
    zw_link = scrapy.Field()
    # 反馈率
    fkl = scrapy.Field()
    # 公司名称
    gsmc = scrapy.Field()
    # 职位月薪
    zwyx = scrapy.Field()
    # 工作地点
    gzdd = scrapy.Field()
    # 发布日期
    gbsj = scrapy.Field()

第二件事:
再spiders文件中新建一个zhilianspider,py文件,来实现自己的爬虫

设置一些基本参数如下:

name = "zhilianSpider"
    allowed_domains = ['zhaopin.com']
    basic_url = "http://sou.zhaopin.com/jobs/searchresult.ashx?"
    TOTAL_PAGE_NUMBER = 90
    KEYWORDS = ['金融IT','机器学习','数据分析','大数据','人工智能']  # 需爬取的关键字可以自己添加或修改

    # 爬取主要城市的记录
    ADDRESS = ['全国', '北京', '上海', '广州', '深圳',
               '天津', '武汉', '西安', '成都', '大连',
               '长春', '沈阳', '南京', '济南', '青岛',
               '杭州', '苏州', '无锡', '宁波', '重庆',
               '郑州', '长沙', '福州', '厦门', '哈尔滨',
               '石家庄', '合肥', '惠州', '太原', '昆明',
               '烟台', '佛山', '南昌', '贵阳', '南宁']

根据基本参数动态生产需要爬取的url,使用parse函数接受上面request获取到的response

    def start_requests(self):
        for keyword in self.KEYWORDS:
            for address in self.ADDRESS:
                for i in range(1,self.TOTAL_PAGE_NUMBER):
                    paras = {'jl':address,
                         'kw':keyword,
                         'p':i}
                    url = self.basic_url + urlencode(paras)
                    print(url)
                    yield Request(url,self.parse)

对获取的response进行解析,提取数据字段,然后组建成item,返回item数据

    def parse(self,response):
        html = response.text

        date = datetime.now().date()
        date = datetime.strftime(date, '%Y-%m-%d')  # 转变成str

        soup = BeautifulSoup(html,'lxml')
        body = soup.body
        data_main = body.find('div',{'class': 'newlist_list_content'})

        if data_main:
            tables = data_main.find_all('table')

            for i,table_info in enumerate(tables):
                item = ZhilianprojectItem()
                if i ==0:
                    continue
                tds = table_info.find('tr').find_all('td')
                zwmc = tds[0].find('a').get_text()  # 职位名称
                item['zwmc'] = zwmc
                zw_link = tds[0].find('a').get('href')  # 职位链接
                item['zw_link'] = zw_link
                fkl = tds[1].find('span').get_text()  # 反馈率
                item['fkl'] = fkl
                gsmc = tds[2].find('a').get_text()  # 公司名称
                item['gsmc'] = gsmc
                zwyx = tds[3].get_text()  # 职位月薪
                item['zwyx'] = zwyx
                gzdd = tds[4].get_text()  # 工作地点
                item['gzdd'] = gzdd
                gbsj = tds[5].find('span').get_text()  # 发布日期
                item['gbsj'] = gbsj

                tr_brief = table_info.find('tr', {'class': 'newlist_tr_detail'})
                # 招聘简介
                brief = tr_brief.find('li', {'class': 'newlist_deatil_last'}).get_text()


                yield item

第三件事:
pipelines组件会获取response解析后的item,因此通常在pipelines.py中进行数据的储存操作。在进行插入前,需要判断一下记录是否已经存在。

    def process_item(self, item, spider):
        if isinstance(item,ZhilianprojectItem):
            zw_link = item['zw_link']
            ret = self.sql.selectLink(zw_link)
            if ret == 1:
                print('该记录已经存在')
                pass
            else:
                zwmc = item['zwmc']
                fkl = item['fkl']
                gsmc = item['gsmc']
                zwyx = item['zwyx']
                gzdd = item['gzdd']
                gbsj = item['gbsj']
                self.sql.insertMysql(zwmc, zw_link, fkl, gsmc, zwyx, gzdd, gbsj)
        return item

本项目采用的是mysql作为后端存储,相关操作可以自行百度,有很多资源。

【论文复现】一种基于价格弹性矩阵的居民峰谷分时电价激励策略【需求响应】(Matlab代码实现)内容概要:本文介绍了一种基于价格弹性矩阵的居民峰谷分时电价激励策略,旨在通过需求响应机制优化电力系统的负荷分布。该研究利用Matlab进行代码实现,构建了居民用电行为与电价变动之间的价格弹性模型,通过分析不同时间段电价调整对用户用电习惯的影响,设计合理的峰谷电价方案,引导用户错峰用电,从而实现电网负荷的削峰填谷,提升电力系统运行效率与稳定性。文中详细阐述了价格弹性矩阵的构建方法、优化目标函数的设计以及求解算法的实现过程,并通过仿真验证了所提策略的有效性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事需求响应、电价机制研究或智能电网优化等相关领域的科研人员及研究生。; 使用场景及目标:①研究居民用电行为对电价变化的响应特性;②设计并仿真基于价格弹性矩阵的峰谷分时电价激励策略;③实现需求响应下的电力负荷优化调度;④为电力公司制定科学合理的电价政策提供理论支持和技术工具。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,深入理解价格弹性建模与优化求解过程,同时可参考文中方法拓展至其他需求响应场景,如工业用户、商业楼宇等,进一步提升研究的广度与深度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值