几行Python代码爬取3000+上市公司的信息


Posted in Python onJanuary 24, 2019

前言

入门爬虫很容易,几行代码就可以,可以说是学习 Python 最简单的途径。

刚开始动手写爬虫,你只需要关注最核心的部分,也就是先成功抓到数据,其他的诸如:下载速度、存储方式、代码条理性等先不管,这样的代码简短易懂、容易上手,能够增强信心。

基本环境配置

  • 版本:Python3
  • 系统:Windows
  • 相关模块:pandas、csv

爬取目标网站

几行Python代码爬取3000+上市公司的信息

实现代码

import pandas as pdimport csvfor i in range(1,178): # 爬取全部页  tb = pd.read_html('http://s.askci.com/stock/a/?reportTime=2017-12-31&pageNum=%s' % (str(i)))[3]   tb.to_csv(r'1.csv', mode='a', encoding='utf_8_sig', header=1, index=0)

3000+ 上市公司的信息,安安静静地躺在 Excel 中:

几行Python代码爬取3000+上市公司的信息

有了上面的信心后,我开始继续完善代码,因为 5 行代码太单薄,功能也太简单,大致从以下几个方面进行了完善:

增加异常处理

由于爬取上百页的网页,中途很可能由于各种问题导致爬取失败,所以增加了 try except 、if 等语句,来处理可能出现的异常,让代码更健壮。

增加代码灵活性

初版代码由于固定了 URL 参数,所以只能爬取固定的内容,但是人的想法是多变的,一会儿想爬这个一会儿可能又需要那个,所以可以通过修改 URL 请求参数,来增加代码灵活性,从而爬取更灵活的数据。

修改存储方式

初版代码我选择了存储到 Excel 这种最为熟悉简单的方式,人是一种惰性动物,很难离开自己的舒适区。但是为了学习新知识,所以我选择将数据存储到 MySQL 中,以便练习 MySQL 的使用。

加快爬取速度

初版代码使用了最简单的单进程爬取方式,爬取速度比较慢,考虑到网页数量比较大,所以修改为了多进程的爬取方式。

经过以上这几点的完善,代码量从原先的 5 行增加到了下面的几十行:

import requestsimport pandas as pdfrom bs4 import BeautifulSoupfrom lxml import etreeimport timeimport pymysqlfrom sqlalchemy import create_enginefrom urllib.parse import urlencode # 编码 URL 字符串start_time = time.time() #计算程序运行时间def get_one_page(i):  try:    headers = {      'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'    }    paras = {    'reportTime': '2017-12-31',    #可以改报告日期,比如2018-6-30获得的就是该季度的信息    'pageNum': i  #页码    }    url = 'http://s.askci.com/stock/a/?' + urlencode(paras)    response = requests.get(url,headers = headers)    if response.status_code == 200:      return response.text    return None  except RequestException:    print('爬取失败')def parse_one_page(html):  soup = BeautifulSoup(html,'lxml')  content = soup.select('#myTable04')[0] #[0]将返回的list改为bs4类型  tbl = pd.read_html(content.prettify(),header = 0)[0]  # prettify()优化代码,[0]从pd.read_html返回的list中提取出DataFrame  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)  return tbldef generate_mysql():  conn = pymysql.connect(    host='localhost',    user='root',    password='******',    port=3306,    charset = 'utf8',     db = 'wade')  cursor = conn.cursor()  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))'  cursor.execute(sql)  conn.close()def write_to_sql(tbl, db = 'wade'):  engine = create_engine('mysql+pymysql://root:******@localhost:3306/{0}?charset=utf8'.format(db))  try:    tbl.to_sql('listed_company2',con = engine,if_exists='append',index=False)    # append表示在原有表基础上增加,但该表要有表头  except Exception as e:    print(e)def main(page):  generate_mysql()  for i in range(1,page):     html = get_one_page(i)    tbl = parse_one_page(html)    write_to_sql(tbl)# # 单进程if __name__ == '__main__':    main(178)  endtime = time.time()-start_time  print('程序运行了%.2f秒' %endtime)# 多进程from multiprocessing import Poolif __name__ == '__main__':   pool = Pool(4)   pool.map(main, [i for i in range(1,178)]) #共有178页  endtime = time.time()-start_time  print('程序运行了%.2f秒' %(time.time()-start_time))

结语

这个过程觉得很自然,因为每次修改都是针对一个小点,一点点去学,搞懂后添加进来,而如果让你上来就直接写出这几十行的代码,你很可能就放弃了。

所以,你可以看到,入门爬虫是有套路的,最重要的是给自己信心。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
python获取文件后缀名及批量更新目录下文件后缀名的方法
Nov 11 Python
python进程类subprocess的一些操作方法例子
Nov 22 Python
Python中join和split用法实例
Apr 14 Python
使用Python脚本来控制Windows Azure的简单教程
Apr 16 Python
详解Python实现按任意键继续/退出的功能
Aug 19 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
Jul 11 Python
Python中scatter函数参数及用法详解
Nov 08 Python
python3.4+pycharm 环境安装及使用方法
Jun 13 Python
Python面向对象封装操作案例详解
Dec 31 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
Python图像处理之图像拼接
Apr 28 Python
python三子棋游戏
May 04 Python
python安装pywin32clipboard的操作方法
Jan 24 #Python
Python中extend和append的区别讲解
Jan 24 #Python
对python pandas读取剪贴板内容的方法详解
Jan 24 #Python
Python3按一定数据位数格式处理bin文件的方法
Jan 24 #Python
Python使用post及get方式提交数据的实例
Jan 24 #Python
在python中利用opencv简单做图片比对的方法
Jan 24 #Python
正确理解Python中if __name__ == '__main__'
Jan 24 #Python
You might like
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
PHP 文件类型判断代码
2009/03/13 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
php实现Linux服务器木马排查及加固功能
2014/12/29 PHP
PHP网站开发中常用的8个小技巧
2015/02/13 PHP
php字符串函数学习之substr()
2015/03/27 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
JavaScript实现查找字符串中第一个不重复的字符
2014/12/29 Javascript
详解JavaScript中基于原型prototype的继承特性
2016/05/05 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
2016/07/22 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
js前端导出Excel的方法
2017/11/01 Javascript
详解Python的Twisted框架中reactor事件管理器的用法
2016/05/25 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
transform python环境快速配置方法
2018/09/27 Python
python实现全盘扫描搜索功能的方法
2019/02/14 Python
python把转列表为集合的方法
2019/06/28 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
介绍一下grep命令的使用
2012/06/28 面试题
高中毕业自我鉴定
2013/12/13 职场文书
普通党员自我剖析材料
2014/10/07 职场文书
工作检讨书怎么写
2015/01/23 职场文书
城南旧事电影观后感
2015/06/16 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
提升Nginx性能的一些建议
2021/03/31 Servers
MySQL系列之一 MariaDB-server安装
2021/07/02 MySQL
python自动化八大定位元素讲解
2021/07/09 Python