特此声明:爬虫要遵守相关法规要求!

喜欢上某个基金网站,但是数据基本上是动态网页的方式,看了一下selenium,requests方案,后面选择了playwright,折腾了一天,基本上可以出相关数据了。

一、同步方案:A网站POC


from playwright.sync_api import sync_playwright
import pandas as pd
#import asyncio
#import re
from playwright.async_api import async_playwright
import random
import time
url = "http://fund.*****.com.cn//" #某基金网站
proxy_to_use = {'server': "localhost:8080"
}def get_index_info(data,str_code):#data = {} #return data code_url = url + str_code +"/interduce.html#interduce"with sync_playwright() as p:browser = p.chromium.launch( headless=False) ## 代理page = browser.new_page()page.goto(code_url)#print(page.title())all_items = page.query_selector_all('.g-dialog')#print(f"all_items : {len(all_items)}")for item in all_items:      text = item.inner_text()text_trim = trim_multi_char(text) ## 去除多余的"\n"," "contents  = text_trim.split("\n")data = trim_data_each(data,contents,str_code)#print(f"values: {values}")browser.close()return datadef trim_multi_char(input_string):strs = list(input_string)strs_len = len(strs)if strs_len < 1:return input_stringout_strs = []for i in range(strs_len):if i == 0: ## 第一个if strs[0] not in [" ",""]:out_strs.append(strs[0])else:if (strs[i] != strs[i-1] and strs[i] not in [" ",""]) or ( strs[i] == strs[i-1] and strs[i] not in ["\n"," ",""]):out_strs.append(strs[i]) return ''.join(out_strs)def get_standard_list_codes(raw_codes):codes = []for _code in raw_codes:fix_code = ""str_code = str(_code)if len(str_code)<6:fix_code = "0"*(6-len(str_code)) + str_codeelse:fix_code = str_codecodes.append(fix_code)return codesdef get_basket_index_raw_data(data,codes):n = 1for code in codes:print(f" download  code : {code}  => 第 {n} 个, 总共 {len(codes)} 个")rand_seconds= random.randint(0,9)time.sleep(rand_seconds)data = get_index_info(data,code)n= n+1if n%100 ==0:path = "C:\\Users\\Administrator\\Desktop\\index_fund\\" + str(n) + ".csv"df_temp = pd.DataFrame(data)df_temp.to_csv(path,encoding="gbk")return data
## [{code =>"xxx"},{code =>"xxx"}]
def trim_data(raw_data):data = {} ## for dict_code in raw_data: ## 每一个for code in dict_code.keys():raw = dict_code[code]raw_trim = trim_multi_char(raw) ## 去除多余的"\n"," " ->只留一个\ncontents = raw_trim.split("\n")assert (len(contents)%2 == 0),f"code :{code} items项key->value不对称错误,请确认!"for i in range(len(contents)):if i%2 ==0 and i < len(contents)-1: _key = contents[i]if _key == "":continuevalue = contents[i+1]if "--" in value:value = ""if _key in data.keys():data[_key].append(value)else:data[_key] = [value]return data
def trim_data_each(data,contents,code): ##每一条#raw_trim = trim_multi_char(raw_each) ## 去除多余的"\n"," " ->只留一个\n#contents = raw_trim.split("\n")assert (len(contents)%2 == 0),f"code :{code} items项key->value不对称错误,请确认!"for i in range(len(contents)):if i%2 ==0 and i < len(contents)-1: _key = contents[i]if _key == "":continuevalue = contents[i+1]if "--" in value:value = ""if _key in data.keys():data[_key].append(value)else:data[_key] = [value]return datadata ={} #
index_fund_path = r"C:\Users\Administrator\Desktop\index_funds.csv"
funds_df = pd.read_csv(index_fund_path,encoding="gbk") ## dataframe
raw_codes = list(funds_df.code)
#raw_codes =[510050]
codes = get_standard_list_codes(raw_codes)
data = get_basket_index_raw_data(data,codes)
df_last = pd.DataFrame(data)
df_last.to_csv(r"C:\Users\Administrator\Desktop\index_fund\index_last.csv",encoding="gbk")

输出csv样例:
总体上还是成功了。

二、同步方案B网站 POC

url = "http://fundf10.*****.com/****_168204.html" #B网站
def get_index_info():data = {} #return data code_url = urlwith sync_playwright() as p:browser = p.chromium.launch( headless=False) ## 代理page = browser.new_page()page.goto(code_url)key_items = page.query_selector_all("table[class='info w790'] tr>th")#info w790value_items = page.query_selector_all("table[class='info w790'] tr > td")#info w790_keys =[]_values =[]for item in key_items:  text = item.inner_text()_keys.append(text)for _item in value_items:_text = _item.inner_text()_values.append(_text)data = dict(list(zip(_keys,_values)))browser.close()return data

输出结果:

{‘基金全称’: ‘中融中证煤炭指数型证券投资基金(LOF)’, ‘基金简称’: ‘中融中证煤炭指数(LOF)’, ‘基金代码’: ‘168204(主代码)’, ‘基金类型’: ‘指数型-股票’, ‘发行日期’: ‘2015年05月27日’, ‘成立日期/规模’: ‘2015年06月25日 / 2.115亿份’, ‘资产规模’: ‘11.21亿元(截止至:2021年09月30日)’, ‘份额规模’: ‘6.6585亿份(截止至:2021年09月30日)’, ‘基金管理人’: ‘中融基金’, ‘基金托管人’: ‘海通证券’, ‘基金经
理人’: ‘赵菲’, ‘成立来分红’: ‘每份累计0.00元(0次)’, ‘管理费率’: ‘1.00%(每年)’, ‘托管费率’: ‘0.22%(每年)’, ‘销售服务费率’: ‘—(每年)’, ‘最高认购费率’: ‘1.00%(前端)’, ‘最高申购费率’: ‘0.00%(前端)’, ‘最高赎回费率’: ‘1.50%(前端)’, ‘业绩比较基准’: ‘95%×中证煤炭指数收益率+5%×同期银行活期存款利率(税后)’, ‘跟踪标的’: ‘中证煤炭指数’}

三、 难点复盘:

从A网站和B网站POC验证上来看,纯技术角度,playwright方案用来做爬虫是理论可行的。

1、playwright的安装
特别是在windows下的安装,可能大概率有折腾的可能。

2、找到所需要的节点
比如:

all_items = page.query_selector_all('.g-dialog')

这个过程可能需要不断试。建议对下面这个方法以及CSS 选择器需要有进一步了解为好:

HTML DOM querySelectorAll() 方法

四、后续改进:

1、异步
目前,异步方案还没有调通,因为playwright install还没有成功,是通过把下载几个浏览器文件 安装的,估计版本还有问题。
关于playwright的安装,还是有不少烦心事。折腾了好几个小时。

可以参考安装资料

2、ip代理池
目前,还没有看到象requests库一样的代理池方案,目前还在研究中。在ip代理池没有弄好前,只好做少量的测试,担心ip被封。
当然,本身也就是学习,不用于其它目的。

python: 动态网页playwright 爬虫实践相关推荐

  1. Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)

    文章目录 一.selenium爬取动态网页 二.爬虫案例分析 三.哈希hash算法与RSA加密 一.selenium爬取动态网页 1.动态网页认知 爬虫其实就是在模仿浏览器的行为 应对要多次数据的交互 ...

  2. org.apache.poi Excel列与行都是动态生成的_网络爬虫:Python动态网页爬虫2种技术方式及示例...

    作者:糖甜甜甜 https://mp.weixin.qq.com/s/5Dwh5cbfjpDfm_FRcpw1Ug 这一讲,我将会为大家讲解稍微复杂一点的爬虫,即动态网页的爬虫. 动态网页技术介绍 动 ...

  3. Python动态网页爬虫技术

    这一讲,我将会为大家讲解稍微复杂一点的爬虫,即动态网页的爬虫. 动态网页技术介绍 动态网页爬虫技术一之API请求法 动态网页爬虫技术二之模拟浏览器法 安装selenium模块下载 Google Chr ...

  4. Python动态网页爬虫-----动态网页真实地址破解原理

    Python动态爬虫 1.目标网站 2.目标网站行为分析 3.目标文件依赖加载分析 4.静态网页分析 5.动态加载代码分析 6.万事俱备 7.只欠东风 7.1获取html代码 7.2获取mh_info ...

  5. Python动态网页爬虫之爬取知乎话题回答

    你是如何开始能写Python爬虫?就这个问题我查看了一下知乎,看到各种大牛写的心得,感觉受益匪浅,于是我有了一种冲动,想把各种大牛回答的心得爬取下来,以后可以细细品味. 首先我们在浏览器输入https ...

  6. Python动态网页数据收集

    对于静态网页,只需要把网页地址栏中的url传到get请求中就可以轻松地获取到网页的数据.但是,经常会遇到直接把网页地址栏中的url传到get请求中无法直接获取到网页的数据的情况,而且右键查看网页源代码 ...

  7. Python动态网页爬虫技巧Selenium(一)

    implicitly_wait() 跟 WebdriverWait()的区别 相同点: 这两个东西,都是为了在测试网页的时候进行等待的 一方面是都可以完成对于动态数据的等待和爬取.(都是一旦完成就直接 ...

  8. python爬动态网页json_爬虫再探实战(四)———爬取动态加载页面——请求json...

    还是上次的那个网站,就是它.现在尝试用另一种办法--直接请求json文件,来获取要抓取的信息. 第一步,检查元素,看图如下: 过滤出JS文件,并找出包含要抓取信息的js文件,之后就是构造request ...

  9. python动态网页图片爬取

    动态网站跟静态网站的区别 在python图片爬虫中,我们爬取的是静态网站.那么静态网站跟动态网站有什么区别呢?其中对于我们写爬虫来说,最大的区别就是用requests.get()获取到的信息,动态网站 ...

  10. python动态网页开发教程_python django创建一个属于自己的动态网站

    您如何开始使用Python创建网站?好吧,你可以自己完成所有工作,并编写一个在Web服务器上运行的程序,接受页面请求并以HTML和其他资源的形式提供响应.然而,这是很多工作,那么为什么在有大量现有工具 ...

最新文章

  1. 如何识别 Linux 上的文件分身
  2. 2019年春节记忆之尹山湖边赏梅
  3. java基础入门-预定义类与自定义类
  4. 003_支持并发的饿汉单例
  5. 总结之:CentOS6.5 LAMP的基本原理以及分主机架构解析
  6. 新装的oracle缺少很多文件夹,丢失所有文件、拥有全备份,缺少后增加的文件
  7. 吴恩达机器学习 -- 逻辑回归(Logistic Regression)
  8. DFS水题 URAL 1152 False Mirrors
  9. 【飞秋】OpenExpressApp对建模支持的初步计划
  10. 我清华毕业,在龙泉寺写代码
  11. 第2节 mapreduce深入学习:12、reducetask运行机制(多看几遍)
  12. KnockoutJS 3.X API 第五章 高级应用(2) 控制后代绑定
  13. linux centos 光盘修复,CentOS的lib库误操作和修复
  14. SQL分页查询,SQL的LIMIT语句用法,SQL如何实现分页查询,SpringBoot实现分页查询。
  15. VMware unlocker解锁步骤
  16. DevExpress chartControl 数据绑定
  17. 商业计划书-智能导盲仗
  18. 联盛德 HLK-W806 (七): 兼容开发板 LuatOS Air103
  19. 三级网络技术备考重点之路由器配置及使用
  20. 基于正点原子触摸屏ui设计_基于黄金比例ui%C9%B8的设计系统

热门文章

  1. 将Linux下python默认版本切换成替代版本
  2. C#_串口通信_SerialPort_一个最基础的串口程序
  3. RequireJS入门(三)转
  4. jQuery-1.9.1源码分析系列(十一) DOM操作续——克隆节点
  5. Scut游戏server引擎Unity3d访问
  6. Android中生成库文件与移除以及导入jar包重复问题
  7. Coolite Toolkit学习笔记七:常用控件TreePanel
  8. 论文阅读笔记——个体识别研究中的计算机辅助照片匹配:以塞伦盖蒂猎豹为例
  9. MySQL-快速入门(12)备份、还原
  10. cocos creator动画编辑器学习