实战项目 1:5 行代码爬取国内所有上市公司信息

Python入门爬虫与数据分析

在正式开始这门专栏课的学习之前,我们先来看一个简单的爬虫案例。兴趣是最好的老师,当你对爬虫产生兴趣的时候,才会更有动力去学它。

▌入门爬虫

网页中有一张表格,内容是全国上市公司相关信息,整个表格有 180 页。我们需要做的工作就是,用几十秒钟把表格所有数据爬取下来,接着保存到本地文件。试想如果不会爬虫,要完成这份工作得费多大力气。

为什么要以这个网页作为第一个爬虫案例呢?有两点原因:

这类表格型数据在网页中非常常见,学会这个爬虫就能爬取一大类的网页数据,很实用。

这个爬虫很简单,5 行代码就可以实现。

好,下面我们就正式开始。

▌简版代码

我们可以先写一个简版代码,只写最核心的,就是抓数据,其他的诸如:下载速度、存储方式、代码条理性等先不管,这样代码写起来容易上手,能增强信心。

下面来看看如何用 5 行代码抓取上面表格中的所有数据。

1 importpandas as pd2 importcsv3 for i in range(1,178): #爬取全部页

4 tb = pd.read_html('http://s.askci.com/stock/a/?reportTime=2017-12-31&pageNum=%s' % (str(i)))[3]5 tb.to_csv('company.csv', mode='a', encoding='utf_8_sig', header=1, index=0)

如果你不太明白上面代码意思,没有关系,后面的课程会介绍。现在只需要动手敲一遍,然后点击运行,几十秒钟之后在本地就可以看到一个名为 company.csv 的文件,打开结果见下表:

这样我们就爬取完了所有数据。怎么样,是不是觉得爬虫有点意思,没有想象中那么难。写几行代码,剩下的交给电脑就好了。

上面的爬虫有些单薄,还可以更完善一些,具体考虑这几个方面:

▌完善代码

增加代码灵活性

上面代码中的 URL 参数是固定的,比如reportTime=2017-12-31 表示爬取的是这一日期的数据,如果想爬取其他时期,需要在 URL 中去修改,不够灵活方便。怎么改变呢,也很简单,可以将日期赋予一个变量,在 URL 外部单独修改变量来爬取不同日期的数据。

增添存储方式

上面文件保存方式选择了 csv 文件,更为常见的方式是保存到数据库中,比如 MySQL、MongoDB 等,这里我们可以选择保存到 MySQL 中,当练习数据库的使用。

加快爬取速度

上面的代码是单进程爬取,爬取 180 页速度相对较慢,要想加快爬取速度可以使用多进程方式。

增加异常处理

上面代码没有任何异常处理措施,一旦爬取失败,我们找不到原因。最好是增加代码异常捕捉方式,可以使用 try except 、if 等语句,让代码更健壮。

考虑上述几方面,代码完善如下:

1 importrequests2 importpandas as pd3 from bs4 importBeautifulSoup4 from lxml importetree5 importtime6 importpymysql7 from sqlalchemy importcreate_engine8 from urllib.parse import urlencode #编码 URL 字符串

9 start_time = time.time() #计算程序运行时间

10 defget_one_page(i,date):11 try:12 headers ={13 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'

14 }15 paras ={16 'reportTime': date,17 #可以改报告日期,比如 2018-6-30 获得的就是该季度的信息

18 'pageNum': i #页码

19 }20 url = 'http://s.askci.com/stock/a/?' +urlencode(paras)21 response = requests.get(url,headers =headers)22 if response.status_code == 200:23 returnresponse.text24 returnNone25 exceptRequestException:26 print('爬取失败')27 defparse_one_page(html):28 soup = BeautifulSoup(html,'lxml')29 content = soup.select('#myTable04')[0] #[0]将返回的 list 改为 bs4 类型

30 tbl = pd.read_html(content.prettify(),header =0)[0]31 #prettify()优化代码,[0]从 pd.read_html 返回的 list 中提取出 DataFrame

32 tbl.rename(columns = {'序号':'serial_number', '股票代码':'stock_code', '股票简称':'stock_abbre', '公司名称':'company_name', '省份':'province', '城市':'city', '主营业务收入(201712)':'main_bussiness_income', '净利润(201712)':'net_profit', '员工人数':'employees', '上市日期':'listing_date', '招股书':'zhaogushu', '公司财报':'financial_report', '行业分类':'industry_classification', '产品类型':'industry_type', '主营业务':'main_business'},inplace =True)33 returntbl34 defgenerate_mysql():35 conn =pymysql.connect(36 host='localhost',37 user='root',38 password='******', #修改为你的密码

39 port=3306,40 charset = 'utf8',41 db = 'wade') #修改为自己的数据库

42 cursor =conn.cursor()43 sql = 'CREATE TABLE IF NOT EXISTS listed_company (serial_number INT(20) NOT NULL,stock_code INT(20) ,stock_abbre VARCHAR(20) ,company_name VARCHAR(20) ,province VARCHAR(20) ,city VARCHAR(20) ,main_bussiness_income VARCHAR(20) ,net_profit VARCHAR(20) ,employees INT(20) ,listing_date DATETIME(0) ,zhaogushu VARCHAR(20) ,financial_report VARCHAR(20) , industry_classification VARCHAR(20) ,industry_type VARCHAR(100) ,main_business VARCHAR(200) ,PRIMARY KEY (serial_number))'

44 cursor.execute(sql)45 conn.close()46 def write_to_sql(tbl, db = 'wade'):47 engine = create_engine('mysql+pymysql://root:******@localhost:3306/{0}?charset=utf8'.format(db))48 try:49 tbl.to_sql('listed_company2',con = engine,if_exists='append',index=False)50 #append 表示在原有表基础上增加,但该表要有表头

51 exceptException as e:52 print(e)53 defmain(page):54 generate_mysql()55 date = '2017-12-31'

56 for i in range(1,page):57 html =get_one_page(i,date)58 tbl =parse_one_page(html)59 write_to_sql(tbl)60 ## 单进程

61 #if __name__ == '__main__':

62 #main(178)

63 #endtime = time.time()-start_time

64 #print('程序运行了%.2f 秒' %endtime)

65 ## 多进程

66 from multiprocessing importPool67 if __name__ == '__main__':68 pool = Pool(4)69 pool.map(main, [i for i in range(1,178)]) #共有 178 页

70 endtime = time.time()-start_time71 print('程序运行了%.2f 秒' %(time.time()-start_time))

代码从原先的 5 行增加到几十行,针对每个点去完善,代码编写过程也很自然,如果一上来就写出这几十行代码,新手可能很快就会放弃。

数据爬取下来之后,可以说爬虫工作就完成了,不过,还可以进一步做一些数据分析,比如像下面这样:

以上,我们从一个简单的爬虫案例入手,初步了解了爬虫是怎么回事,能干什么事。代码具体编写知识,后续课程一一介绍。

文中完整代码和素材,可以在下方链接中得到:

另外,如果想更充分地学习本专栏课程,可以参考《Python3 网络爬虫开发实战》这本书。

下一节课,我们再用一个实战来学习爬虫基本技法。

python爬上市公司信息_实战项目 1:5 行代码爬取国内所有上市公司信息相关推荐

  1. python获取虎牙弹幕_教你用20行代码爬取直播平台弹幕(附源码)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  2. python 播放本地音乐_实战项目—python实现本地音乐播放器

    随着网络的发展,我们已经很少将音乐下载到本地,而是直接在线听歌,方便而又直接.也许你用的音乐播放器是这个 也许是这个 这都不是重点,今天我们要用python自己打造一款音乐播放器. 具体思路 使用py ...

  3. java提取图片位置信息_实战项目——获取图片中的GPS位置信息和拍摄时间

    今天突然看到有人写过获取图片中位置信息的程序.我觉得很有趣,也就自己实践了一下,研究了一下 话不多说,先上代码 1 #!/usr/bin/env python3 2 #-*- coding: utf- ...

  4. python爬取付费直播的视频_教你用20行代码爬取直播平台弹幕(附源码)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  5. 教你用python实现34行代码爬取东方财富网信息,爬虫之路,永无止境!!

    教你用python实现34行代码爬取东方财富网信息,爬虫之路,永无止境!! 代码展示: 开发环境: windows10 python3.6 开发工具: pycharm weddriver 库: sel ...

  6. python pyquery不规则数据的抓取_爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网...

    爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网 前言 上篇文章 PyQuery (一) 回顾.今天来介绍具体 PyQuery 的使用方法. 穷游网目标与分析 开始之前,按照之前的套路一步 ...

  7. pyquery获取不到网页完整源代码_爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网...

    爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网 前言 上篇文章 PyQuery (一) 回顾.今天来介绍具体 PyQuery 的使用方法. 穷游网目标与分析 开始之前,按照之前的套路一步 ...

  8. Python爬虫利用18行代码爬取虎牙上百张小姐姐图片

    Python爬虫利用18行代码爬取虎牙上百张小姐姐图片 下面开始上代码 需要用到的库 import request #页面请求 import time #用于时间延迟 import re #正则表达式 ...

  9. python:利用20行代码爬取网络小说

    文章目录 前言 一.爬虫是什么? 二.实现过程 总结 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 今天,来给大家一个分享一下如何使用20爬虫行代码爬取网络小说(这里我们以龙 ...

最新文章

  1. javascript操作对象的方法
  2. 炫界 (978) -(建工发现应用克隆漏)_湖南建工装配式建筑迈入“加速度”
  3. CSV出力ボタンラッパー(asp.net)[イベントの作り方に役立つ]
  4. mockito手动注入依赖_依赖注入–手动方式
  5. html option ajax,Ajax实现简单下拉选项效果【推荐】
  6. ElasticSearch API实现CRUD
  7. element-UI table自定义表头
  8. (转)万万没想到,无人车其实是个劳动密集型产业
  9. 了解 云原生 和 边缘计算
  10. 计算机简史:你想不通去脉,是因为不了解来龙
  11. STM32开发 -- MMA8452Q 手册阅读
  12. private关键字使用实例
  13. Flask扩展包安装出现错误:Could not find a version that satisfies the requirement ...
  14. 【模式识别与人工智能】【实验报告合集】Bayes + Fisher + PCA + Decision Tree + KNN + K-Means + SVM
  15. 我的C#第一次实验:中秋博饼
  16. 麒麟信安操作系统衍生产品解决方案 | 安全探针软件,竖起内网安全护城墙
  17. Sound Forge Pro 3 for Mac(专业音频编辑工具)
  18. 该使用哪些工具来诊断和修复 JVM 内存调试的问题?
  19. 思科带来顶尖智慧“朋友圈”
  20. 微信小程序自定义导航栏机型适配--底部Tabbar--view高度--底部按钮适配

热门文章

  1. 弘辽科技:拼多多五步教你日销百单
  2. 2020.8.25 斗鱼Android开发二面面经
  3. 信息系统项目管理师(2022年)—— 重点内容:10大管理、5大过程组、47个过程信息汇总
  4. 电子计算机技术的发展情况,新时期电子信息技术发展现状与趋势分析
  5. 【PPic】基于Electron+Vue+iView的图床应用设计
  6. 【Nodejs】Http模块01
  7. 2021年华中杯数学建模挑战赛B题技术问答社区重复问题识别求解全过程文档及程序
  8. js 判断是否为 Android IOS IPAD IPHONE 等移动设备访问
  9. 爱了,阿里P8纯手码出489页SQL优化手册,附笔记源码
  10. PlatoFarm推出正式版游戏经济模型的特点分析