几行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和bash统计CPU利用率的方法
Jul 10 Python
关于Python中空格字符串处理的技巧总结
Aug 10 Python
Python 实现字符串中指定位置插入一个字符
May 02 Python
python发送邮件脚本
May 22 Python
在numpy矩阵中令小于0的元素改为0的实例
Jan 26 Python
python中列表的切片与修改知识点总结
Jul 23 Python
Django 通过JS实现ajax过程详解
Jul 30 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
win10环境下配置vscode python开发环境的教程详解
Oct 16 Python
python3 webp转gif格式的实现示例
Dec 10 Python
Python 内置函数globals()和locals()对比详解
Dec 23 Python
python hmac模块验证客户端的合法性
Nov 07 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
PHP IPV6正则表达式验证代码
2010/02/16 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
2013/06/26 PHP
PHP使用数组实现矩阵数学运算的方法示例
2017/05/29 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
js 操作select和option常用代码整理
2012/12/13 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
js图片上传前预览功能(兼容所有浏览器)
2016/08/24 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
js实现自定义进度条效果
2017/03/15 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
python求斐波那契数列示例分享
2014/02/14 Python
使用Python多线程爬虫爬取电影天堂资源
2016/09/23 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
Python字典创建 遍历 添加等实用基础操作技巧
2018/09/13 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
2019/01/08 Python
Django组件content-type使用方法详解
2019/07/19 Python
结束运行python的方法
2020/06/16 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
python自动生成sql语句的脚本
2021/02/24 Python
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
2014年医学生毕业自我鉴定
2014/03/26 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
警示教育片观后感
2015/06/17 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
2019年度行政文员工作计划范本!
2019/07/04 职场文书