前言:最近基金火热,此代码仅供学习娱乐,本人初学python,代码还有不少问题,鉴于能力有限,无法解决,希望各位大神多多指教。

目标:抓取编号,基本信息,评级, 夏普率等数据

所用模块:requests库,BeautifulSoup,re正则,协程模块,csv等

编写思路:requests库获取信息
BeautifulSoup和re正则清洗所需数据
csv 用于存储数据
time 计时与延时
gevent协程提速

话不多说,直接上代码

import requests
import csv
from bs4 import BeautifulSoup
import re
import gevent
from gevent import monkey
import time
from gevent.queue import Queue
listtask=[]#协程工作列表
listallxiap2=['--','--']
#空列表用于补充xiapu
fundcode_list = []
#编号列表
fundcodeurl_list2= []
#fund网址
fundcodexiapu_list=[]
#xiapu指标网址
grade_list1 = []
#写入列表存fund基本信息
grade_list3 = []
#写入列表存fundxiap
grade_list4 = []
#写入列表存fund编码
keypointfund_list=[]
#fund信息列列表
xpandbzc_list=[]
#xiapu和bzc信息列表
xpandbzc_list2=[]
#xiapu总列表
sevengrade_list=[]
#存评级
sevengrade_list2=[]
#存所有评级
headers = {"Referer": "http://fund.eastmoney.com/fund.html","User-Agent": "                                "#写入自己电脑ip 的user-agent}                                                                                                            #伪装
work = Queue()
def fundcode(p,e):
#函数(funds的网站)res_funds=requests.get('http://fund.eastmoney.com/allfund.html',headers=headers)                                    #获取网站bs_funds=BeautifulSoup(res_funds.text.encode('ISO-8859-1').decode('gb18030'),'html.parser')                         #解析网站number_funds1=bs_funds.find('div',class_="data-list m_b").find_all('li')                                            #找funds编码路径for number_funds2 in number_funds1:number_funds3=number_funds2.find('a')number_funds5=str(number_funds3)r1 = re.findall('\d+', number_funds5)                                                                           #正则找编码fundcode_list.append(r1)fundcode_list5 = [x for x in fundcode_list if x != []]                                                              #删除空列表print(len(fundcode_list5))for i in range(p):                                                                                                  # 依次取出列表中fund编号try:number_funds3 =fundcode_list5[i+e][0]                                                     # 取出列表内的编号6500为一组,funds总数/2grade_list4.append(str(number_funds3))#print(str(number_funds3))url = 'http://fund.eastmoney.com/' + number_funds3 + '.html'                                                    #各个fund基本信息的网址xiapuurl='http://fundf10.eastmoney.com/tsdata_'+number_funds3+'.html'                                           #xiapu等信息的网址fundcodexiapu_list.append(xiapuurl)                                                                             #xiapu和bzc的信息网址存进列表fundcodeurl_list2.append(url)                                                                                   #单个fund的网址except IndexError:print("无数据")for s in range(p):try:fundcodeurl = fundcodeurl_list2[s]                                                                              # 从fundurl列表中提取网址xiapuurl1 = fundcodexiapu_list[s]                                                                               # 从fundxiapu列表中提取网址work.put_nowait(fundcodeurl)work.put_nowait(xiapuurl1)except IndexError:print("无数据")with open('D://python//items1//items//ttjj//ttjjbianhao.csv', 'w', encoding='utf-8-sig',newline='') as tt:          #打开新csvwriter = csv.writer(tt)header = ['FUND编号']writer.writerow(header)writer.writerows(grade_list4)                                                                                   #写入编码进csv(编码有bug,会写入3遍)return
def fundall(p):for s in range(p):                                                                                              #设置网址个数time.sleep(1)fundcodeurl=fundcodeurl_list2[s]                                                                            #从fundurl列表中提取网址xiapuurl1=fundcodexiapu_list[s]                                                                             #从fundxiapu列表中提取网址headers1 = {"Referer": "http://fund.eastmoney.com/"+"str(number_funds3)"+".html","User-Agent":"                                "#写入自己电脑ip 的user-agent}headers2 = {"Referer": "http://fund.eastmoney.com/tsdata_"+"str(number_funds3)"+".html","User-Agent": "                                "#写入自己电脑ip 的user-agent}fundcodeurl=work.get_nowait()xiapuurl1=work.get_nowait()print(fundcodeurl)print(xiapuurl1)res_fundcodeurl=requests.get(fundcodeurl,headers=headers1)                                                   #基本信息网址代码bs_fundcodeurl=BeautifulSoup(res_fundcodeurl.text.encode('ISO-8859-1').decode('utf-8'),'html.parser')       #清洗代码number_grade=bs_fundcodeurl.find('li',class_="increaseAmount")                                              #未处理的基本信息fundscale0= bs_fundcodeurl.find('div',class_="infoOfFund")                                                  #未处理的基本信息res_xiapufundurl=requests.get(xiapuurl1,headers=headers2)                                                    #获取xiapu网址信息代码bs_xiapufindurl=BeautifulSoup(res_xiapufundurl.text,'html.parser')                                          #清洗代码xia1=bs_xiapufindurl.find('div',class_="box").find_all("tr")                                                #获取未处理的xia的信息for m in range(6):fundscale1=fundscale0.find_all('td')[m].text                                                            #获取基本的信息keypointfund_list.append(fundscale1)                                                                    #信息添加进基本信息列表#print(keypointfund_list)for number_grade1 in number_grade:sevengrade=number_grade1.find_all('h3')                                                                 #获得需要的评级for f in range(8):sevengrade2=sevengrade[f].text.replace("<h3>",' ')sevengrade3=sevengrade2.replace("</h3>",' ')sevengrade_list.append(sevengrade3)sevengrade_list2.append(sevengrade_list)for xia2 in xia1:for k in range(2):xia3=xia2.find_all(class_="num")[k].text                                                            #获得xia的信息xpandbzc_list.append(xia3)                                                                          #将xia的信息存进xia的列表xpandbzc_list2.append(xpandbzc_list)#print(len(xpandbzc_list2[s]))print(((len(xpandbzc_list2[s]))+2)/8)if (len(xpandbzc_list2[s])<8*(s+1)):xpandbzc_list2[s].extend(listallxiap2)else:pass#print(sevengrade_list2)def open1():with open('D://python//items1//items//ttjj//ttjj1.csv','w',encoding='utf-8-sig',newline='') as tt:                       #打开csv存基本信息writer=csv.writer(tt)header=['基金类型','基金规模','基金经理','成 立 日','管 理 人','基金评级']writer.writerow(header)for t in range(int(q)):a=int(6*t)b=int (6*t+6)keypo1=keypointfund_list[a:b]grade_list1.append(keypo1)writer.writerows(grade_list1)return
def open2():with open('D://python//items1//items//ttjj//ttjj2.csv','w',encoding='utf-8-sig',newline='') as tt:writer=csv.writer(tt)header=['近一周','近一月','近三月','近六月','今年来','近一年','近两年','今年来']writer.writerow(header) #写入headerfor t in range(int(q)):#t个funda=int(8*t)  #此列表有些问题 列表里面的分列表有q个b=int(8*t+8)seve=sevengrade_list2[t][a:b]#取出数据writer.writerow(seve)#写入csv中return
def open3():with open('D://python//items1//items//ttjj//ttjj3.csv','w',encoding='utf-8-sig',newline='') as tt:writer=csv.writer(tt)header=[' ','','标准差(近一年)','标准差(近两年)','夏普率(近一年)','夏普率(近两年)','信息比率(近一年)','信息比率(近两年)']writer.writerow(header)#写入headerfor t in range(int(q)):a=int(8*t)#此列表有些问题 列表里面的分列表有q个b=int(8*t+8)fundcodexiap=xpandbzc_list2[t][a:b]grade_list3.append(fundcodexiap)#取出数据writer.writerows(grade_list3)#写入csv中returnstart = time.time()
q=input("请输入总数funds个数:")
e=input("请输入已抓取的总数:")
#因为没有ip代理池,避免封ip,采取多次抓取数据fundcode(int(q),int(e))
for l in range(2):task=gevent.spawn(fundcode(int(q),int(e)))listtask.append(task)
gevent.joinall(listtask)
fundall(int(q))
open1()
open2()
open3()
end = time.time()
print(start-end)

经过手动处理的效果图,勉强完成目标
最后:
此程序无ip代理池,需要多次分开抓取,
无多线程,运行极慢,
数据抓入csv后需要手动处理,为避免出现IndexError空列表错误,需要在csv删除最后重复的基金编码数据
(ps:一直没找到为什么基金编码会重复抓三次的原因)

希望各位大神多多指教,第一次写代码,自知很多不足,还请指正!!!

python 使用BeautifulSoup爬取天天基金网主要数据相关推荐

  1. [python爬虫] BeautifulSoup爬取+CSV存储贵州农产品数据

    在学习使用正则表达式.BeautifulSoup技术或Selenium技术爬取网络数据过程中,通常会将爬取的数据存储至TXT文件中,前面也讲述过海量数据存储至本地MySQL数据库中,这里主要补充Bea ...

  2. 爬虫beautifulsoup爬取豆瓣读书数据

    爬虫beautifulsoup爬取豆瓣读书数据:主要是爬取收集书的名字.类别.简介,用于接下来的聚类学习. 豆瓣链接:https://book.douban.com/tag/?view=type&am ...

  3. python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析

    这篇文章主要介绍了python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析的实例,帮助大家更好的理解和学习使用python.感兴趣的朋友可以了解下 一.环境准备 python3.8.3 ...

  4. AJAX教程美食滤镜,Python爬虫实例——爬取美团美食数据

    1.分析美团美食网页的url参数构成 1)搜索要点 美团美食,地址:北京,搜索关键词:火锅 2)爬取的url https://bj.meituan.com/s/%E7%81%AB%E9%94%85/ ...

  5. Python从网络接口爬取json天气预报数据绘制高温低温双折线图

    Python从网络接口爬取json天气预报数据绘制高温低温双折线图 实现一个功能,从网络上的天气预报接口读取天气预报中的json数据,json数据中包含高温和低温以及日期,然后把日期作为横坐标,高温和 ...

  6. beautifulsoup_如何使用 Python 和 BeautifulSoup 爬取网站

    作者丨Justin Yek 译者丨平川 互联网上的信息如此之多,任何人穷其一生也无法全部消化吸收.你需要的不是访问这些信息,而是一种可伸缩的方式,可以用来收集.组织和分析这些信息.你需要的是 Web ...

  7. Windows下利用python+selenium+firefox爬取动态网页数据(爬取东方财富网指数行情数据)

    由于之前用urlib和request发现只能获取静态网页数据,目前爬取动态网页有两种方法, (1)分析页面请求 (2)Selenium模拟浏览器行为(霸王硬上弓),本文讲的就是此方法 一.安装sele ...

  8. Python爬虫 senlenium爬取拉勾网招聘数据,你学会了吗

    一.基本思路 目标url:https://www.lagou.com/ 用selenium爬虫实现,输入任意关键字,比如 python 数据分析 ,点击搜索,得到的有关岗位信息,爬取下来保存到Exce ...

  9. Python爬虫:爬取喜马拉雅音频数据详解

    前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...

最新文章

  1. java中json重复数据结构_怎么将有JSON中有相同值放在一组?
  2. .net环境故障处理
  3. mobaxterm 传文件夹_如何使用MobaXterm上传文件到远程Linux系统-MobaXterm使用教程
  4. 【Python】3D Axis
  5. ASP.NET Core 源码阅读笔记(5) ---Microsoft.AspNetCore.Routing路由
  6. u3d文件上传至服务器,unity 上传图片到云服务器
  7. HoloLens开发手记-全息Hologram
  8. python:改良廖雪峰的使用元类自定义ORM
  9. python编程技术总结_大数据技术学习之Spark技术总结
  10. 长ping命令返回结果输出为文本
  11. iphone导出视频 无法连接到设备_爱思助手无法识别设备或者连接超时解决办法...
  12. Java Web 高性能开发,第 2 部分: 前端的高性能
  13. 某bobo在线视频APP下载暴力流逆向
  14. lucene java 庖丁解牛_Lucene分词器之庖丁解牛
  15. 论文阅读:《A Wavenet For Speech Denoising》
  16. pip设置代理 豆瓣源
  17. 多元函数第二:线性空间(2)子空间与生成空间
  18. 特征工程7种常用方法
  19. IDEA git配置
  20. 单片机控制两个步进电机画圆_基于单片机的步进电机转速控制设计详解(附程序)...

热门文章

  1. 【笔记】嵌入式系统概述
  2. python软件长什么样图片_听说各大网站的色情图片识别都是用的这个程序?Python识别色情图...
  3. UITextField改变return键显示的字
  4. 【Faiss】PQ和IVF介绍
  5. python 字符画
  6. 苹果新品发布会亮点回顾:四大产品同时发布 iPhone 6s压轴登场
  7. Oracle EBS中打印二维码
  8. IntelliJ 使用Maven构建Android项目过程
  9. android 车载蓝牙模块,安卓APP通过蓝牙串口模块控制DSP车机收音机
  10. Springboot 集成 mybatis 开启二级缓存(redis)