文章目录

  • 目的
  • 分析请求
  • 编写代码
  • 尾记

目的

工作中遇到一个需求,通过需要通过网站查询船舶名称得到MMSI码,网站来自船讯网。

分析请求

根据以往爬虫的经验,打开F12,通过输入船舶名称,观察发送的请求,发现返回数据的网址


本身网址是一个get请求,直接用这个网址请求,也能返回数据,即网址本身并没有加密,这就简单许多,直接通过改变参数,就能实现数据的获取,马上开始动手

编写代码

代码中,通过request发送请求,为了不给服务器造成太大压力,每隔0.5秒发送一个请求,因为会出现查询不到的情况,通过exception判断,数据结果一是通过pandas中的to_excel存为excel文件,或者是直接通过pymysql入数据库,为了提高入库的速度,采用一次拼接三百条的方式入库

import requests
import os
import time
import pymysql
import pandas as pd
import re
import random'''
author:shikailiang
function:通过读取船舶数据,分别请求拿到json数据入库
'''#定义入库的类
class company_ship_in_database:def __init__(self):self.conn = pymysql.connect(host="", user="", password="", database="", charset="utf8")self.cursor = self.conn.cursor()self.last_path = os.path.abspath(os.path.dirname(os.getcwd()))#写入mysqldef if_inbase(self, ship_name):exits_sql = "select * from bms_company_ship where ship_name=\'" + ship_name + '\''self.cursor.execute(exits_sql)if self.cursor.fetchall():return Trueelse:return Falsedef in_database(self,data_list):#data_list为所有数据的列表j=1sql = ""# sql0 = "insert into bms_company_ship(oc_name,ship_name,mmsi) values"# rowcount=len(data_list)for i in data_list:if self.if_inbase(i[1][1]):update_sql="UPDATE bms_company_ship SET mmsi = '"+ str(i[0]) +"' WHERE ship_name = '" + i[1][1] + "'"# print(j)self.cursor.execute(update_sql)self.conn.commit()print("已经更新第" + str(j) + "条")else:# sql2 = (("(" + "'{}'," * 3)[:-1] + ")").format(i[1][0],i[1][1],i[0])# sql = sql + "," + sql2# print(sql0 + sql[1:])# if j <= rowcount:#如果执行错误回滚当前事务# print(sql0 + sql[1:])insert_sql='insert into bms_company_ship(oc_name,ship_name,mmsi) values("{}","{}","{}")'.format(i[1][0],i[1][1],i[0])self.cursor.execute(insert_sql)print("已经插入第" + str(j) + "条")self.conn.commit()j=j+1# def is_have_mmsi(self,ship_list):#     sql='select * from cjh_product.bms_ocship where ship_name=' + ship_list[1]#     self.cursor.execute(sql)#通过pandas写入exceldef in_xls(self, data_list):#data_list为所有数据的列表df=pd.DataFrame(data_list)df.to_excel(self.last_path + r"\data\result.xls",header=False,index=False)#请求船的方法def company_ship_in_database(self):data_path = self.last_path + r"\data"file=open(data_path + "\company.txt")data=[]j = 0for i in file.readlines():chuan=i.strip().split()dic={'f':'auto','kw':chuan[1]}rq=requests.get("http://searchv3.shipxy.com/shipdata/search3.ashx",params=dic)if rq.status_code==200:try:result_json=rq.json()result=result_json['ship'][0]if re.search('\d+',result['n']).group()==re.search('\d+',chuan[1]).group():# print(re.search('\d+',result['n']).group())# print(re.search('\d+',chuan[1]).group())result=result['m']data.append([result,chuan])else:data.append(["", chuan])except:data.append(["",chuan])else:print(chuan + "请求错误")# time.sleep(random.random())j = j + 1if divmod(j,100)[1] == 0:print("已经请求" + str(j) + "条")# if j > 20:#     # self.in_xls(data)#     self.in_database(data)#     break# self.in_xls(data)self.in_database(data)if __name__=="__main__":company_ship=company_ship_in_database()company_ship.company_ship_in_database()

尾记

写程序的过程中其实有发现一个问题,即我们请求的其实是输入文字时候自动发送的请求,其实有一个问题,如果我们需要查询的是"华为5"的船,但是如果系统中没有这个船,就是返回"华为548"的船,所以在代码中需要做一个判断
即用正则提取出船的数字,然后和返回的船的数字进行比对,如果一致,即为同一条船舶,即在代码中做了如下处理
if re.search('\d+',result['n']).group()==re.search('\d+',chuan[1]).group():

【Python3】简易爬虫实现船舶的MMSI的获取相关推荐

  1. python爬取淘宝商品做数据挖掘_Python 3爬虫 数据清洗与可视化实战 Python数据抓取技术 python3网络爬虫教程书籍 运用Python工具获取电商平台页面数据挖掘书籍...

    A8 书    名:Python 3爬虫 数据清洗与可视化实战 作 译 者:零一,韩要宾,黄园园 出版时间:2018-03 千 字 数:200 版    次:01-01 页    数:212 开   ...

  2. python新闻爬虫教程_python简易爬虫教程--(一)批量获取搜狐新闻

    我们先从简单的抓取文本信息开始,来写我们的第一个爬虫程序,获取搜狐新闻的内容. 我们首先来介绍一下我们需要用到的库. 爬虫程序的步骤,一般可以分为三步: 1.获取网页源码(html源码): 2.从代码 ...

  3. [Python3网络爬虫开发实战] 7-动态渲染页面爬取-4-使用Selenium爬取淘宝商品

    在前一章中,我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过Ajax获取的,但是这些Ajax接口参数比较复杂,可 ...

  4. python3爬虫入门教程-总算懂得python3.4爬虫入门教程

    Python是一款功能强大的脚本语言,具有丰富和强大的库,重要的是,它还具有很强的可读性,易用易学,非常适合编程初学者入门.以下是小编为你整理的python3.4爬虫入门教程 环境配置:下载Pytho ...

  5. python多线程爬虫实例-Python3多线程爬虫实例讲解代码

    多线程概述 多线程使得程序内部可以分出多个线程来做多件事情,充分利用CPU空闲时间,提升处理效率.python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点, ...

  6. 【Python3网络爬虫开发实战】3-基本库的使用 1.2-处理异常

    前一节我们了解了请求的发送过程,但是在网络不好的情况下,如果出现了异常,该怎么办呢?这时如果不处理这些异常,程序很可能因报错而终止运行,所以异常处理还是十分有必要的. urllib的error模块定义 ...

  7. Python3网络爬虫快速入门实战解析(一小时入门 Python 3 网络爬虫)

    Python3网络爬虫快速入门实战解析(一小时入门 Python 3 网络爬虫) https://blog.csdn.net/u012662731/article/details/78537432 出 ...

  8. 《Python3网络爬虫开发实战(第二版)》上市了!!!!

    " 阅读本文大概需要 5 分钟. " 告诉大家一个好消息:我的好朋友崔庆才老师的<Python3网络爬虫开发实战(第二版)>现在正式上市了!!!! 没错,就是这本: 就 ...

  9. python3网络爬虫代码_《Python3网络爬虫开发实战代码》

    <Python3网络爬虫开发实战代码>\appium\.git\COMMIT_EDITMSG, 7 , 2017-08-15 <Python3网络爬虫开发实战代码>\appiu ...

  10. 【Python3网络爬虫开发实战】4-解析库的使用-3 使用pyquery

    在上一节中,我们介绍了Beautiful Soup的用法,它是一个非常强大的网页解析库,你是否觉得它的一些方法用起来有点不适应?有没有觉得它的CSS选择器的功能没有那么强大? 如果你对Web有所涉及, ...

最新文章

  1. 算法学习之路|完美数列
  2. pyspark DataFrame 转RDD
  3. idea下一次Jar包依赖问题的解决过程
  4. 太极创客ESP8266 - NodeMCU、JSON、MQTT教程(基于Arduino)
  5. MFC实现图像灰度、采样和量化功能详解
  6. 20 张图揭开内存管理的迷雾,瞬间豁然开朗
  7. Android 8.0学习(25)---系统的应用图标适配
  8. 苏宁官宣史上力度最大818:比京东便宜10%
  9. usercontroller.java,springboot controller 参数绑定
  10. 修改服务器的AJP监听地址,修改服务器的AJP监听地址
  11. Ubuntu12.04中如何让命令行路径变短
  12. 语音系统智能AI机器人AI源码营销机器人电销机器人智能电话机器人拨号机器人语音机器人空号识别FreeSWITCH呼叫中心中间ipbxIPBX科大识别阿里识别语音识别语音翻译
  13. xcode8插件管理工具
  14. 信用卡诈骗罪16个有效辩点
  15. docke 安装rap_RAP2:使用docker镜像进行构建,启动部署
  16. 电商平台如何实现分账功能
  17. mysql lsl_GitHub - LSL-Git/MyBatis_Dynamic_SQL: mybatis 动态SQL使用
  18. Vue绘制折线图并渲染数据
  19. NCT青少年编程能力等级测试Python编程二级-模拟卷(含答案)
  20. 腾讯云服务器增加网卡,腾讯云服务器(CVM主机)绑定多个弹性网卡和IP地址的方法...

热门文章

  1. 十款免费数据恢复软件
  2. 计算机硬盘应该什么格式化,硬盘应该格式化成哪种格式为好?
  3. 水晶易表 Xcelsius 2008 安装指南 完美支持office2010
  4. 机器学习--人口普查数据分析
  5. Jmeter小程序压力测试案例
  6. 计算机组装与维护过程与方法,计算机组装与维护的实训报告
  7. oracle静默安装集群,Oracle RAC 静默安装实践
  8. 高数笔记(十四):多元复合函数的求导法则,隐函数的偏导数,多元微分在几何上的应用
  9. 2021-6-26 激光的工业应用
  10. 强制删除“无法删除文件/文件夹”方法全集合