本章将通过爬取51jobs求职网站中的python职位信息来实现不同方式的数据存储的需求。

github地址———>源代码

我们先来看一下:51jobs网站

我们需要的数据有,职位名 公司名 工作地点 薪资,这四个数据。
然后我们看一下他们都在哪
发现他们都在

这里面

需要的数据,相应的都在这里面

好了到这,我们已经知道了抓取的数据都在哪了。接下来我们开始写代码。

创建项目

使用命令scrapy startproject tongscrapy 来创建一个scrapy框架。

然后使用scrapy crawl py51jobs https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,1.html 来创建一个spider项目。

完成这些后打开 pycharm,将创建的项目,添加到pycharm中。

如下图所示:

然后就是开始重写各个py文件了。

重写 py51jobs.py

class Py51jobsSpider(scrapy.Spider):name = 'py51jobs'#allowed_domains = ['51jobs.com']start_urls = ['https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,1.html']def parse(self, response):item = TongscrapyItem()for i in range(4, 45):#每页共有40条数据item['position'] = response.xpath('//*[@id="resultList"]/div[{num}]/p/span/a/text()'.format(num=i), first=True).extract_first().strip()item['company'] = response.xpath('//*[@id="resultList"]/div[{num}]/span[1]/a/text()'.format(num=i), first=True).extract_first()item['place'] = response.xpath('//*[@id="resultList"]/div[{num}]/span[2]/text()'.format(num=i), first=True).extract_first()item['salary'] = response.xpath('//*[@id="resultList"]/div[{num}]/span[3]/text()'.format(num=i), first=True).extract_first()print('抓取完毕一条')yield itemfor i in range(2, 10): #抓取页数,可自行更改url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,'+str(i)+'.html'yield scrapy.Request(url, callback=self.parse)print('抓取完毕一页')

重写item.py

class TongscrapyItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()position = scrapy.Field()company = scrapy.Field()place = scrapy.Field()salary = scrapy.Field()

重写pipelines.py

# 数据存储在csv文件里
class savefileTongscrapyPipeline(object):def __init__(self):self.file = open('py51jobsinfo.csv', 'w', newline='')self.csvwriter = csv.writer(self.file)self.csvwriter.writerow(['职位名称', '公司名', '地点', '薪资'])def process_item(self, item, spider):self.csvwriter.writerow([item["position"], item["company"], item["place"], item["salary"]])return itemdef close_spider(self, spider):self.file.close()# 数据存储在MySQL数据库里
class mysqlTongscrapyPipeline(object):# 采用异步机制写入MySQLdef __init__(self, dppool):self.dppool = dppool# 用固定方法 【写法固定】  获取配置文件内信息@classmethoddef from_settings(cls, settings):  # cls实际就是本类 MysqlTwistedPipelinedpparms = dict(host=settings["MYSQL_HOST"],db=settings["MYSQL_DBNAME"],user=settings["MYSQL_USER"],passwd=settings["MYSQL_PASSWD"],charset="utf8",cursorclass=MySQLdb.cursors.DictCursor,  # 指定 curosr 类型  需要导入MySQLdb.cursorsuse_unicode=True)# 由于要传递参数 所以参数名成要与connnect保持一致# 用的仍是MySQLdb的库 twisted并不提供# 异步操作# adbapi # 可以将MySQLdb的一些操作变成异步化操作dppool = adbapi.ConnectionPool("MySQLdb", **dpparms)  # 告诉它使用的是哪个数据库模块  连接参数# 另外 以上dpparms的参数也可单独写,这样会造成参数列表过大return cls(dppool)  # 即实例化一个pipelinedef process_item(self, item, spider):# 使用twisted将mysql插入编程异步操作# 指定操作方法和操作的数据 [下面会将方法异步处理]query = self.dppool.runInteraction(self.do_insert, item)# AttributeError: 'Deferred' object has no attribute 'addErrorback'# query.addErrorback(self.handle_error)  # 处理异常query.addErrback(self.handle_error)  # 处理异常def handle_error(self, failure):# 定义错误 处理异步插入的异常print(failure)def do_insert(self, cursor, item):"""此类内其他都可以看作是通用 针对不同的sql操作只需要改写这里即可了:param cursor::param item::return:"""insert_sql = """insert into py51jobsinfo(position, company, place, salary)values (%s, %s, %s, %s)"""cursor.execute(insert_sql, (item["position"], item["company"], item["place"], item["salary"]))return item

最后重写settings.py,写入mysql数据库的配置信息和相应的ITEM_PIPELINES

BOT_NAME = 'tongscrapy'SPIDER_MODULES = ['tongscrapy.spiders']
NEWSPIDER_MODULE = 'tongscrapy.spiders'
ROBOTSTXT_OBEY = True
ITEM_PIPELINES = {#注意后头的参数是通道运行顺序,两个要不相同,不然会出错。'tongscrapy.pipelines.savefileTongscrapyPipeline': 300,'tongscrapy.pipelines.mysqlTongscrapyPipeline': 500,
}
#Mysql数据库的配置信息
MYSQL_HOST = '192.168.1.106'     #数据库地址
MYSQL_DBNAME = 'quanluo'         #数据库名字
MYSQL_USER = 'root'             #数据库账号
MYSQL_PASSWD = '123'         #数据库密码MYSQL_PORT = 3306               #数据库端口

运行py51jobs.py,并输出结果:

使用代码:scrapy crawl py51jobs
运行结果为(展示最后部分):

2020-05-09 23:24:08 [scrapy.core.scraper] DEBUG: Scraped from <200 https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,4.html>
None
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
抓取完毕一页
2020-05-09 23:24:08 [scrapy.core.engine] INFO: Closing spider (finished)
2020-05-09 23:24:08 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 7745,'downloader/request_count': 10,'downloader/request_method_count/GET': 10,'downloader/response_bytes': 208750,'downloader/response_count': 10,'downloader/response_status_count/200': 9,'downloader/response_status_count/404': 1,'dupefilter/filtered': 64,'elapsed_time_seconds': 8.845924,'finish_reason': 'finished','finish_time': datetime.datetime(2020, 5, 9, 15, 24, 8, 227376),'item_scraped_count': 369,'log_count/DEBUG': 380,'log_count/INFO': 10,'request_depth_max': 2,'response_received_count': 10,'robotstxt/request_count': 1,'robotstxt/response_count': 1,'robotstxt/response_status_count/404': 1,'scheduler/dequeued': 9,'scheduler/dequeued/memory': 9,'scheduler/enqueued': 9,'scheduler/enqueued/memory': 9,'start_time': datetime.datetime(2020, 5, 9, 15, 23, 59, 381452)}
2020-05-09 23:24:08 [scrapy.core.engine] INFO: Spider closed (finished)

scrapy实战----将数据存储到csv文件和MySQL数据库中相关推荐

  1. 数据存储在.csv文件乱码,数据写入才一部分就报错'gbk' codec can't encode character '\xee' in position 45: illegal multibyte

    使用python爬虫爬取规则数据后转化成来List格式,将其存储在.csv 文件中 使用Python写文件的时候,或者将网络数据流写入到本地文件的时候,大部分情况下会遇到:UnicodeEncodeE ...

  2. 将csv文件导入到数据库中

    1.csv文件简介 CSV全称 Comma Separated values,是一种用来存储数据的纯文本文件格式,通常用于电子表格或数据库软件.这样你就发现了,csv其实就是纯文本文件,可以使用记事本 ...

  3. 收藏!用Python一键批量将任意结构的CSV文件导入MySQL数据库。

    Python有很多库可以对CSV文件和Excel文件进行自动化和规模化处理.但是,使用数据库可以将计算机完成任务的能力提升成千上万倍! 那么问题来了,如果有很多个文件需要导入数据库,一个一个操作效率太 ...

  4. 列数较多的csv文件导入mysql数据库(过程及问题记录)

    刚接触mysql,想把几个表导入到数据库中,结果就遇到了问题. 原始数据是这样的: 1.使用navicat报错: [ERR] Cannot create table[china_sites_20140 ...

  5. python亿级mysql数据库导出_Python之csv文件从MySQL数据库导入导出的方法

    Python之csv文件从MySQL数据库导入导出的方法 发布时间:2020-10-26 07:39:02 来源:脚本之家 阅读:53 作者:张行之 Python从MySQL数据库中导出csv文件处理 ...

  6. csv导入mysql php实现_PHP实现csv文件导入mysql数据库的方法

    这篇文章主要介绍了PHP编程实现csv文件导入mysql数据库的方法,涉及php文件读取.转换.数据库的连接.插入等相关操作技巧,需要的朋友可以参考下 具体如下: config.db.php内容如下: ...

  7. c++ 写入文件_利用Python把数据存储在csv文件中

    鼠年第一天开盘,很多股票跌停,太闹心了!今天再找点开心的事情做吧.人生最幸福的事情莫过于看到自己写的程序调试通过了! 前面我们介绍了,如何用Python做一个串口通讯的上位机.用这个上位机我们可以从E ...

  8. scrapy爬取京东商品评论并保存至Mysql数据库中

    scrapy爬取京东商品评论并保存至Mysql数据库 一.总体概述 二.实践过程 2.1网页解析 2.2使用单线程爬取代码如下: 2.3使用scrapy爬取数据 2.4绘制词云图结果: 三.总结 一. ...

  9. linux mysql csv文件_Linux MySQL数据库如何导出数据文件?导出csv语句命令

    广告 2017年11月13日 MySQL中你可以使用SELECT ... INTO OUTFILE语句来简单的导出数据到文本文件上. 使用SELECT ... INTO OUTFILE语句导出数据 以 ...

最新文章

  1. 解决Redhat Linux AS使用yum时出现This system is not registered with RHN的问题(改用CentOS的yum)...
  2. iPhone因安全漏洞上热搜,苹果:暂时无法修复,法国总统也中招
  3. keras inception_resnet_v2训练
  4. bp神经网络训练_数据分析模型6——神经网络基础(人工智能的底层模型)
  5. VC++注册,卸载OCX控件,以及判断是否注册
  6. SpringBoot集成 Shiro
  7. 洛谷P2234 [HNOI2002]营业额统计 set简易解法
  8. Vmware在ubuntu虚拟机上安装Vmtools
  9. Android 经常使用设计模式(一)
  10. 2021爱分析・中国采购数字化趋势报告
  11. 0基础也可直接运行的微信表情包批量转换
  12. caps scrlk numlk 闪烁
  13. 《华杉讲透孙子兵法》分享
  14. OSChina 愚人节乱弹 —— 开个小电影专栏放一天
  15. 央行新规收款码事件|还有人不知道收款码的概念?
  16. android 4.4刷机,刷机大师V3.4.4更新:支持Android 4.4
  17. 三年前找工作的我,希望给正在求职的你一些启发
  18. mysql2004报错_mysqlbinlog备份时候报错Sanity check failed
  19. 攻防世界 Wire1
  20. neo4j桌面版安装

热门文章

  1. GNN-CS224W: 3 Node Embeddings
  2. MFC程序逆向 – 消息篇(上)+(下)
  3. Redis哨兵模式(一主二从三哨兵)
  4. 铁路行业通信平台方案
  5. Photoshop-颜色的调整
  6. 浙大罗煜:关于土壤微生物驱动有机碳过程的几点思考(今晚7点半)
  7. 益智游戏网开发之路二(网址yzyx.info)
  8. C++设计模式——模板方法模式(高屋建瓴)
  9. 模拟输出21点所有可能的Black Jack牌型
  10. 运用 Ntop 监控网络流量