来源:python 研究者
今天分析一个爬虫小案例,小白或者爬虫入门的小伙伴推荐阅读。
前言
入门爬虫很容易,几行代码就可以,可以说是学习 Python 最简单的途径。
刚开始动手写爬虫,你只需要关注最核心的部分,也就是先成功抓到数据,其他的诸如:下载速度、存储方式、代码条理性等先不管,这样的代码简短易懂、容易上手,能够增强信心。
基本环境配置
版本:Python3
系统:Windows
相关模块:pandas、csv
版本:Python3
系统:Windows
相关模块:pandas、csv
爬取目标网站
实现代码
3000+ 上市公司的信息,安安静静地躺在 Excel 中:
展开全文
有了上面的信心后,我开始继续完善代码,因为 5 行代码太单薄,功能也太简单,大致从以下几个方面进行了完善:
增加异常处理
增加异常处理
由于爬取上百页的网页,中途很可能由于各种问题导致爬取失败,所以增加了 try except 、if 等语句,来处理可能出现的异常,让代码更健壮。
增加代码灵活性
增加代码灵活性
初版代码由于固定了 URL 参数,所以只能爬取固定的内容,但是人的想法是多变的,一会儿想爬这个一会儿可能又需要那个,所以可以通过修改 URL 请求参数,来增加代码灵活性,从而爬取更灵活的数据。
修改存储方式
修改存储方式
初版代码我选择了存储到 Excel 这种最为熟悉简单的方式,人是一种惰性动物,很难离开自己的舒适区。但是为了学习新知识,所以我选择将数据存储到 MySQL 中,以便练习 MySQL 的使用。
加快爬取速度
加快爬取速度
初版代码使用了最简单的单进程爬取方式,爬取速度比较慢,考虑到网页数量比较大,所以修改为了多进程的爬取方式。
经过以上这几点的完善,代码量从原先的 5 行增加到了下面的几十行:
start_time = time.time #计算程序运行时间defget_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 = '( '爬取失败')
defparse_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中提取出DataFrametbl.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) returntbl
defgenerate_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
defwrite_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表示在原有表基础上增加,但该表要有表头exceptException ase: print(e)
defmain(page): generate_mysqlfori inrange( 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_timeprint( '程序运行了%.2f秒'%endtime)
# 多进程frommultiprocessing importPool if__name__ == '__main__': pool = Pool( 4) pool.map(main, [i fori inrange( 1, 178)]) #共有178页endtime = time.time-start_timeprint( '程序运行了%.2f秒'%(time.time-start_time))
结语
这个过程觉得很自然,因为每次修改都是针对一个小点,一点点去学,搞懂后添加进来,而如果让你上来就直接写出这几十行的代码,你很可能就放弃了。
爬虫我还是非常推荐下面这几本书的,有需要的同学可以公众号后台咨询小助手。公众号:后台输入:小助手 ,暗号(爬虫书).
入门: 最全的零基础学Python的问题 | 零基础学了8个月的Python |实战项目 | 学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |从万众期待到口碑扑街!唐探3令人失望 | 笑看新倚天屠龙记 | 灯谜答题王 | 用Python做个海量小姐姐素描图 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏 | 九宫格 | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI:会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf! |再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐! |
年度爆款文案
1). 卧槽!Pdf转Word用Python轻松搞定 !
2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃
3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密
4). 80行代码!用Python做一个哆来A梦分身
5).你必须掌握的20个python代码,短小精悍,用处无穷
6). 30个Python奇淫技巧集
7). 我总结的80页《菜鸟学Python精选干货.pdf》,都是干货
8). 再见Python!我要学Go了!2500字深度分析 !
9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片