百度指数本身已经很好用了,但是如果进行二次整理,需要把原始数据采集下来就不是那么方便了。网页的请求只有一次,
需要的具体数据随鼠标的移动变化,所以,常规的requests请求网页,解析网页并不能满足需求,感觉可以使用selenium模拟完成鼠标移动,
进而获取数据,但是还没进行实际测试,检查网页源代码,感觉事情并没有那么简单,只好先选择另外一种,比较笨的方法。
实测在数据量不大的情况下,效果显著。
主要步骤
-
原始数据存在于
class="index-trend-chart"
的div里,随鼠标移动数据变化,所以只要模拟鼠标的移动动作,然后复制这个div的内容。 -
选择工具实现上一步的想法,这里使用的按键精灵,这个软件(姑且叫它软件了)需要根据自己电脑的屏幕情况具体操作,
(x,y)表示指数数据第一天的屏幕坐标,(x1,y1)表示class="index-trend-chart"
div的屏幕坐标,x右移的步长值需要自己测试。
代码如下:x = 63 y = 639 x1 = 1287 y1= 609 For 365 MoveTo x, y Delay 100 MoveTo x1, y1 LeftClick 1 RightClick 1 MoveTo x1+90, y1+96 Delay 100 LeftClick 1 MoveTo x1+264, y1+184 Delay 100 LeftClick 1 t = Plugin.Sys.GetCLB() Call Plugin.File.WriteFileEx("F:\python.txt",t) Delay 100 x=x+3 Next
-
解析上一步获取的outHtml内容文件。解析方法有很多,使用BeautifulSoup解析即可。写入表格文件中,
from bs4 import BeautifulSoup import csv f = open("python.txt") txt = f.read() soup = BeautifulSoup(txt,"lxml") cf = open("data.csv",'wt',newline='',encoding='utf-8') w = csv.writer(cf) daily = soup.findAll("div",{"class":"index-trend-chart"}) for i in daily: d = i.findAll('div',{'style':'color: #999;'}) data = i.findAll('div',{'style':'margin: 6px 0;'}) for u in data: row = u.get_text().split('\n\xa0\xa0') row.append(d[0].get_text().split(' ')[0]) print(row) w.writerow(row) cf.close()
经验总结
虽然看起来不是很优雅,但不管黑猫白猫,能捉到老鼠就是好猫,一年365组数据400毫秒一次,大概3分钟不到,也不存在对付反爬措施,获取小批量数据的需求还是可以采用的。
原文地址
附:按键精灵资料参考.