几行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之list和str比较
Sep 20 Python
Python实现的HTTP并发测试完整示例
Apr 23 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
May 06 Python
python实现将文本转换成语音的方法
May 28 Python
获取python文件扩展名和文件名方法
Feb 02 Python
Request的中断和ErrorHandler实例解析
Feb 12 Python
python文本数据相似度的度量
Mar 12 Python
python抓取搜狗微信公众号文章
Apr 01 Python
python 基于TCP协议的套接字编程详解
Jun 29 Python
Python脚本导出为exe程序的方法
Mar 25 Python
python3.x中安装web.py步骤方法
Jun 23 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 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
收音机的保养
2021/03/01 无线电
打造计数器DIY三步曲(上)
2006/10/09 PHP
PHP 设计模式之观察者模式介绍
2012/02/22 PHP
php实现中文转数字
2016/02/18 PHP
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
js获取select标签选中值的两种方式
2014/01/09 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
2015/07/27 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
2016/05/23 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
Python 文件处理注意事项总结
2017/04/10 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
Python用input输入列表的实例代码
2020/02/07 Python
python绘制封闭多边形教程
2020/02/18 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
python实现canny边缘检测
2020/09/14 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
仿酷狗html5手机音乐播放器主要部分代码
2013/05/15 HTML / CSS
西班牙品牌鞋子、服装和配饰在线商店:Esdemarca
2021/02/17 全球购物
高中自我鉴定范文
2013/11/03 职场文书
联谊会主持词
2014/03/26 职场文书
交通安全责任书范本
2014/07/24 职场文书
社区综治工作汇报
2014/10/27 职场文书
实践论读书笔记
2015/06/29 职场文书
2016关于预防职务犯罪的心得体会
2016/01/21 职场文书
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android
vue+echarts实现多条折线图
2022/03/21 Vue.js
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL