使用selenium库中的webdriver爬取100ppi的数据

因为本人做期货量化,经常需要用到基差,需要经常去生意社看基差的数据。也就是如下的目标网址:

...

100ppi.com/sf2/day-2011

http://www.100ppi.com/sf2/day-2011-08-26.html,

http://www.100ppi.com/sf2/day-2011-08-27.html,

...

网址中的日期是变化的,如果是工作日通常是有数据的,如果是非工作日则 无数据。

因为这个网址上的数据是动态的,是无法用requests爬取的,通常只能用webdriver模拟浏览器爬取。

下面我们就来把左边六列的数据爬下来。

import pandas as pd
import numpy as np
from selenium import webdriver
import datetime
import re
import time

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('chromedriver',options=options)

url="http://www.100ppi.com/sf2/day-"

start_date=datetime.date(2018,1,1)
df_final=pd.DataFrame(columns=["品名","现货价","主力合约","主力合约价格","基差","基差率"])

for i in range(500):
    dlt=datetime.timedelta(days=i)
    offset=str(start_date+dlt)
    url=url+offset+".html"
    # print(url)
    driver.get(url)
    x=driver.find_elements_by_xpath("//tbody")[1].text.replace("上海期货交易所","").replace("大连商品交易所","").replace("郑州商品交易所","").replace("\n"," ").replace("  "," ")
    index=x.find("铜")
    if index<0:
        url = "http://www.100ppi.com/sf2/day-"
        continue
    x=x[index:]
    c=re.compile("\D+")
    r=set(re.findall(c,x))
    r.discard(" ")
    r2=set()
    for e in r:
        e=e.strip("%").strip()
        r2.add(e)
        r2.discard("")
        r2.discard(".")
        r2.discard('-')
    for e in r2:
        x=x.replace(e,"\n"+e)

    y=x.split("\n")
    if "" in y:
        y.remove("")

    ll=[]
    for e in y:
        e=e.split()[:6]
        ll.append(e)
    if [] in ll:
        ll.remove([])

    df=pd.DataFrame(data=ll,columns=["品名","现货价","主力合约","主力合约价格","基差","基差率"])

    df["基差率"] = df["基差率"].str.strip('%').astype(float) / 100
    df.sort_values(by="基差率",ascending=False)
    df["日期"]=offset
    print(df)
    url="http://www.100ppi.com/sf2/day-"
    df_final=df_final.append(df,sort=False)
    time.sleep(3)
df_final.reset_index(drop=True)
print(df_final)
df_final.to_csv("jc.csv")

上面的代码是可以直接在python3环境下运行的,但是需要把chrome的webdriver下载下来并放到python3的解释器同一个文件夹下。

因为上面的表格非常不规则,另外还经常数据缺失,处理过程稍微有点复杂,需要用到pandas,datetime,正则表达式re模块。

最后运行的结果是这样的:

最后拿到的csv文件是这样的:

玻璃钢生产厂家萍乡玻璃钢花瓶厂汉中玻璃钢树池坐凳厂抚州玻璃钢装饰工程价格温州玻璃钢垃圾桶亳州玻璃钢花池厂珠海玻璃钢餐桌椅公司咸阳玻璃钢花盆加工烟台玻璃钢外壳定做三明玻璃钢天花吊顶哪家好临汾玻璃钢卡通雕塑定制铜川玻璃钢花盆定制朔州玻璃钢浮雕制作鄂州不锈钢家具厂家银川玻璃钢制品制造鸡西玻璃钢浮雕定做朔州玻璃钢种植池张掖玻璃钢人物雕塑价格晋城玻璃钢造型制造泰安不锈钢雕塑制造六安玻璃钢花坛多少钱江苏玻璃钢花钵多少钱钦州玻璃钢公仔雕塑公司肇庆玻璃钢人物雕塑厂南通玻璃钢前台哪家好芜湖玻璃钢动物雕塑加工林芝玻璃钢产品哪家好德阳玻璃钢天花吊顶批发烟台玻璃钢卡通雕塑加工遂宁玻璃钢产品哪家好海口玻璃钢花盆加工香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化