工作中遇到一个需求,通过需要通过网站查询船舶名称得到MMSI码,网站来自船讯网。
根据以往爬虫的经验,打开F12,通过输入船舶名称,观察发送的请求,发现返回数据的网址
本身网址是一个得到请求,直接用这个网址请求,也能返回数据,即网址本身并没有加密,这就简单许多,直接通过改变参数,就能实现数据的获取,马上开始动手
代码中,通过请求发送请求,为了不给服务器造成太大压力,每隔0.5秒发送一个请求,因为会出现查询不到的情况,通过例外判断,数据结果一是通过熊猫中的to_excel存为excel文件,或者是直接通过pymysql入数据库,为了提高入库的速度,采用一次拼接三百条的方式入库
进口的要求 进口操作系统 导入的时间 进口pymysql 熊猫作为pd导入 进口再保险 “‘ 作者:shikailiang 功能:通过读取船舶数据,分别请求拿到json数据入库 “‘ #定义入库的类 类company_ship_in_database: def __init__(自我): 自我。康涅狄格州=pymysql.connect(主机=?92.168.1.222”,用户=案?密码=癈jh # Sjzx@”=安馐浴笔菘?charset=皍se utf8”) 自我。光标=self.conn.cursor () #获取当前文件的父级地址 自我。last_path=os.path.abspath (os.path.dirname (os.getcwd ())) #写入mysql def in_database(自我,data_list): # j用来对数据进行计数 j=1 #定义sql sql=" " #定义sql头 sql0="插入bms_company_ship_test (oc_name、ship_name mmsi)价值观” rowcount=len (data_list) 因为我在data_list: #定义拼接sql sql2=((“(”+”“{}”,“* 3) (: 1) +”)”) .format(我[1][0],[1][1],[0]) sql=sql +”、“+ sql2 #打印(sql0 + sql [1:]) 如果divmod (j, 300)[1]==0或j==rowcount: #如果执行错误回滚当前事务 #打印(sql0 + sql [1:]) 试一试: self.cursor。执行(sql0 + sql [1]): 除了: #执行错误,回滚事务 self.conn.rollback () 继续 sql=" " self.conn.commit () j=+ 1 #通过熊猫写入excel def in_xls(自我,data_list): df=pd.DataFrame (data_list) #通过熊猫实现存为excel df.to_excel(自我。last_path + r \ data \ result.xls,头=False,指数=False) #请求船的方法 def company_ship_in_database(自我): data_path=自我。last_path + r“\数据” 文件=打开(data_path + " \ company.txt ") data=https://www.yisu.com/zixun/[] j=0 因为我在file.readlines (): #将船公司和船舶名称分开 .split栓=i.strip () () dic={' f ': '汽车', 千瓦:川[1] } rq=requests.get (" http://searchv3.shipxy.com/shipdata/search4.ashx " params=dic) #判断是否请求成功 如果rq.status_code==200: 试一试: result_json=rq.json () 结果=result_json[‘船’][0] #判断船舶数字部分是否相同 如果re.search (\ d +,结果[' n ']) .group ()==re.search (\ d +,栓[1]).group (): 结果=结果(“m”) data.append([因此,栓) 其他: 数据。追加([",栓)) 除了: data.append([",栓)) 其他: 打印(栓+“请求错误”) time . sleep (0.5) j=+ 1 如果divmod (j, 100) [1]==0: 打印(“已经请求“+ str (j) +“条”) #如果j比;10: # self.in_xls(数据) #打破 self.in_database(数据) if __name__==癬_main__”: company_ship=company_ship_in_database () company_ship.company_ship_in_database ()
写程序的过程中其实有发现一个问题,即我们请求的其实是输入文字时候自动发送的请求,其实有一个问题,如果我们需要查询的是“华”为5的船,但是如果系统中没有这个船,就是返回“华为548”扽船,所以在代码中需要做一个判断
,