几行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基础教程之基本数据类型和变量声明介绍
Aug 29 Python
python刷投票的脚本实现代码
Nov 08 Python
Python在线运行代码助手
Jul 15 Python
Python使用getpass库读取密码的示例
Oct 10 Python
django框架自定义用户表操作示例
Aug 07 Python
Python selenium根据class定位页面元素的方法
Feb 26 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
Jul 28 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 Python
Python监听键盘和鼠标事件的示例代码
Nov 18 Python
Python基础之元组与文件知识总结
May 19 Python
python使用matplotlib绘制图片时x轴的刻度处理
Aug 30 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和XSL stylesheets转换XML文档
2006/10/09 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
jquery默认校验规则整理
2014/03/24 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
2016/05/17 Javascript
JavaScript提升性能的常用技巧总结【经典】
2016/06/20 Javascript
Node.js中使用mongoose操作mongodb数据库的方法
2017/09/12 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
JavaScript执行环境及作用域链实例分析
2018/08/01 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
Python中集合的内建函数和内建方法学习教程
2015/08/19 Python
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
python绘制玫瑰的实现代码
2020/03/02 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
Python接口测试环境搭建过程详解
2020/06/29 Python
Django model class Meta原理解析
2020/11/14 Python
canvas使用注意点总结
2013/07/19 HTML / CSS
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
印度尼西亚在线时尚购物网站:ZALORA印尼
2016/08/02 全球购物
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
VELTRA台湾:世界自由行专家
2017/08/15 全球购物
Linux文件系统类型
2012/09/16 面试题
生物化学研究助理员求职信
2013/10/09 职场文书
竞聘演讲稿
2014/04/24 职场文书
2014年幼师工作总结
2014/11/22 职场文书
财务个人年度总结范文
2015/02/26 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书
岁月神偷观后感
2015/06/11 职场文书
七年级英语教学反思
2016/02/15 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
Java 超详细讲解数据结构中的堆的应用
2022/04/02 Java/Android