python+按键精灵实现百度指数数据爬取

百度指数本身已经很好用了,但是如果进行二次整理,需要把原始数据采集下来就不是那么方便了。网页的请求只有一次,
需要的具体数据随鼠标的移动变化,所以,常规的requests请求网页,解析网页并不能满足需求,感觉可以使用selenium模拟完成鼠标移动,
进而获取数据,但是还没进行实际测试,检查网页源代码,感觉事情并没有那么简单,只好先选择另外一种,比较笨的方法。
实测在数据量不大的情况下,效果显著。

主要步骤

  1. 原始数据存在于class="index-trend-chart"的div里,随鼠标移动数据变化,所以只要模拟鼠标的移动动作,然后复制这个div的内容。

  2. 选择工具实现上一步的想法,这里使用的按键精灵,这个软件(姑且叫它软件了)需要根据自己电脑的屏幕情况具体操作,
    (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
    
    

  3. 解析上一步获取的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分钟不到,也不存在对付反爬措施,获取小批量数据的需求还是可以采用的。
原文地址
附:按键精灵资料参考.

你可能感兴趣的:(学习笔记)