当前位置: 首页 > 后端技术 > Python

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

时间:2023-03-26 00:09:28 Python

前言爬取入门简单,几行代码,可以说是最简单的Python学习方法。当你刚开始手工写爬虫的时候,你只需要关注最核心的部分,也就是先成功抓取到数据,而忽略其他如:下载速度、存储方式、代码组织等。这样的代码简短、易懂、易用。可以增强信心。基础环境配置版本:Python3系统:Windows相关模块:pandas、csv抓取目标网站实现代码importpandasaspdimportcsvforiinrange(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',编码='utf_8_sig',header=1,index=0)3000+上市公司信息,静静躺在Excel中:有了以上信心后,我开始继续完善代码,因为5行代码太单薄了,功能过于简单,大致从以下几个方面进行了改进:增加异常处理。由于爬取了几百页的网页,中间很可能因为各种问题导致爬取失败,所以加入了tryexcept,if等语句。处理可能的异常并使代码更健壮。增加代码灵活性第一版代码有固定的URL参数,所以只能抓取固定的内容,但是人的想法是多变的,可能一次要爬这个,也可能一次需要另一个,所以可以通过修改URL请求参数来增加。代码灵活,爬取更灵活的数据。修改第一版代码的存储方式,我选择了大家最熟悉也最简单的存储到Excel的方式。人是惰性动物,很难离开自己的舒适区。但是为了学习新的知识,所以我选择将数据存储在MySQL中,以练习MySQL的使用。加快爬取速度第一版代码采用了最简单的单进程爬取方式,爬取速度比较慢。考虑到网页数量较多,修改为多进程爬取方式。经过以上几点的改进,代码量从原来的5行增加到下面的几十行:stringstart_time=time.time()#计算程序运行时间defget_one_page(i):try:headers={'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)chrome/66.0.3359.181Safari/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)ifresponse.status_code==200:returnreturnresponse.textnN一个returnexceptRequestException:print('crawlingfailed')defparse_one_page(html):soup=BeautifulSoup(html,'lxml')content=soup.select('#myTable04')[0]#[0]将返回列表更改为bs4类typetbl=pd.read_html(content.prettify(),header=0)[0]#prettify()优化代码,[0]从pd.read_html返回的列表中提取DataFrametbl.rename(columns={'序号':'serial_number','股票代码':'stock_code','股票简称':'stock_abbre','公司名称':'公司名称','省份':'省份','城市':'城市','主营业务收入(201712)':'main_bussiness_income','净利润(201712)':'net_profit','员工人数':'employees','上市日期':'listing_date','招股说明书':'zhaogushu','公司财务报告':'financial_report','行业分类':'industry_classification','产品类型':'industry_type','主营业务':'main_business'},inplace=True)returntbldefgenerate_mysql():conn=pymysql.connect(host='localhost',user='root',password='******',port=3306,charset='utf8',db='wade')orcursor=conn.cu()sql='如果不存在则创建表listed_company(serial_numberINT(20)NOTNULL,stock_codeINT(20),stock_abbreVARCHAR(20),company_nameVARCHAR(20),provinceVARCHAR(20),cityVARCHAR(20),main_bussiness_incomeVARCHAR(20),net_profitVARCHAR(20),employeesINT(20),listing_dateDATETIME(0),zhaogushuVARCHAR(20),financial_reportVARCHAR(20),industry_classificationVARCHAR(20),industry_typeVARCHAR(100),main_businessVARCHAR(200),PRIMARYKEY(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))尝试:tbl.to_sql('listed_company2',con=engine,if_exists='append',index=False)#append表示在原有表基础上增加,但应该表要有表头除了Exceptionase:print(e)defmain(page):generate_mysql()foriinrange(1,page):html=get_one_page(i)_page=(html)write_to_sql(tbl)##单进程if__name__=='__main__':main(178)endtime=time.time()-start_timeprint('程序运行了%.2f秒'%endtime)#多进程frommultiprocessingimportPoolif__name__=='__main__':pool=Pool(4)pool.map(main,[iforiinrange(1,178)])#一共178页endtime=time.time()-start_timeprint('程序运行了%.2f秒'%(time.time()-start_time))Conclusion这个过程感觉很自然,因为每次修改都是针对一个小点,稍微学一点,看懂了再补充,如果让你直接写这几十行代码,你大概会放弃所以可见爬虫入门是有套路的,给自己信心是最重要的。以上就是本文的全部内容。希望本文的内容对您的学习或工作有一定的参考价值。感谢您对小编的支持。最近整理了一套Python学习资料分享给大家。都是干货内容,包括教程视频、电子书、源码笔记、学习路线图、实战项目、面试题等,去gzh【Python编程学习圈】免费领取即可,回复关键词【学习资料】,抓紧时间!

猜你喜欢