这个网站的反爬比较初级,页面上有一个滑动验证码,但是不存在js加密反爬之类的东西,所以只需要识别出来验证码图片的缺口位置,以Post参数的形式返回给服务端就可以请求到数据了。

本次流程有两种方式来实现,一种方式是使用requests.get()/post()的形式,另一种方式是使用session;前一种方式需要先请求获取cookie,然后每次携带cookie进行请求,后一种方式相对步骤简单些。

这里选择使用session的方式。

如果用前一种方式尝试,直接请求该网站主页返回的信息中没有cookie,直接请求获取验证码的url时既可以获取图片信息,也可以获取cookie。

  • 第一步:请求验证码图片

    请求到验证码图片后,可以根据缺口位置的RGB颜色值范围,来找出缺口的位置,也可以先灰度化处理,再来判断缺口的位置,这里先灰度化。

    class Spider(object):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0",'Host': 'credit.customs.gov.cn','Referer': 'http://credit.customs.gov.cn/','Accept-Encoding': 'gzip, deflate',"Accept-Language": "zh-CN,zh;q=0.9",'Connection': 'keep-alive',"Origin": "http://credit.customs.gov.cn",'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',}index_url = 'http://credit.customs.gov.cn'image_post_url = 'http://credit.customs.gov.cn/ccppserver/ccpp/initFirstImage'session = requests.session()distance = ''def request_image(self):response1 = self.session.post(url=self.image_post_url, headers=self.headers)if response1.status_code == 200:# print(response1.text)result = json.loads(response1.text)data = result.get('data', '')if data:# 返回的这个是图片的二进制数据的base64编码,所以进行decodebig_image = base64.b64decode(data.get('comp', ''))# 其实这个小的图片并不需要(缺口的图片)small_image = base64.b64decode(data.get('compMin', ''))with open('big_image.jpg', 'wb') as f:f.write(big_image)with open('small_image.jpg', 'wb') as f:f.write(small_image)# 以文件形式读取图片# image = Image.open('big_image.jpg')# 以二进制流形式读取图片image = Image.open(BytesIO(big_image))# 会打开图片工具显示图片# image.show()# 转换成灰度化图片()gray = image.convert('L')# 转换成二值化图片,(默认阈值127)# binary = image.convert('I')# 保存图片gray.save('gray.jpg')self.distance = self.get_distance3(gray)print('缺口距最左侧的距离为{}'.format(self.distance))
    

    这里get_distance()的方法有两种。

    1. 使用getpixel()

      getpixel((width, height)),前面的参数是横坐标(宽度),后面的纵坐标(高度),返回width和height像素点的RGB颜色值,即返回(r,g,b)。(灰度图只返回一个值,表示灰度值)

      @staticmethod
      def get_distance2(gray):width, height = gray.sizefor col in range(width):for row in range(height-250):# 这里的的值需要反复测试,选出一个合适的值,可以利用windows电脑的画图工具,查看具体的像素点,利用getpixel来获取值进行对比。if gray.getpixel((col, row)) < 25:flag_i = Trueflag_j = True# 这里当寻找到一个点的灰度值满足条件时,对其后面一百列和下面一百行都进行检测是否满足,若满足则返回当前列的值,否则继续寻找for i in range(row+1, row+100):if gray.getpixel((col, i)) >= 25:flag_i = Falsebreakfor j in range(col+1, col+100):if gray.getpixel((j, row)) >= 25:flag_j = Falsebreakif flag_i and flag_j:return col
      
    2. 将图片转换成二维数组:

      @staticmethod
      def get_distance1(gray_image):# 若image为彩色图,则转换为三维数组(三通道)# image_array = np.array(image)# 灰度图转换gray为二维数组(双通道)gray_array = np.array(gray_image)# print(len(gray_array)) 图片的高度# print(len(gray_array[0])) 图片的宽度for row in range(len(gray_array)):for col in range(len(gray_array[row])):if gray_array[row][col] < 25:flag_i = Trueflag_j = Truefor i in range(row + 1, row + 101):if gray_array[i][col] >= 25:flag_i = Falsebreakfor j in range(col + 1, col + 100):if gray_array[row][j] >= 25:flag_j = Falsebreakif flag_i and flag_j:return col
      

      以上两种方式太过硬性,即要求接下来的100行,100列全部满足要求,无一例外,万一有例外呢?所以又有了第三种方式,只要90%以上满足就可以。

      @staticmethod
      def get_distance3(gray):width, height = gray.sizefor col in range(width):for row in range(height-250):if gray.getpixel((col, row)) < 25:count_i = 0count_j = 0for i in range(row + 1, row + 100):if gray.getpixel((col, i)) < 25:count_i += 1for j in range(col + 1, col + 100):if gray.getpixel((j, row)) < 25:count_j += 1if count_i > 90 and count_j > 90:return col
      

      这里有一个小技巧,行的循环范围最大不超过height-250,通过查看small_image图片的属性可以看到为250*250像素的图形,所以我们寻找缺口位置的最上方的高度,不可能在倒数250高度的范围内,这样可以减少循环次数。

  • 第二步:验证是否识别缺口距离成功

    def check_image(self):post_data = {'rx': self.distance + random.random()}response = self.session.post(url='http://credit.customs.gov.cn/ccppserver/ccpp/checkImage',data=post_data,headers=self.headers)print(response.text)result = json.loads(response.text)if response.status_code == 200 and result.get('ok', False):return True
  • 第三步:查询数据

    def search_data(self):post_data = {"nameSaic": "小米", "rx": self.distance + random.random()}url = 'http://credit.customs.gov.cn/ccppserver/ccpp/queryList'self.headers.update({'Content-Type': 'application/json; charset=utf-8','Referer': 'http://credit.customs.gov.cn/ccppwebserver/pages/ccpp/html/ccppindex.html'})response = self.session.post(url=url,json=post_data,headers=self.headers)if response.status_code == 200:print(response.text)
    

    这里我们通过在Chrome中,查看该Post请求的Form Data,选择view source为{“rx”:932.6538461538462,“nameSaic”:“小米”}的形式,所以这里post的参数使用json而不是data,使用data是无法请求成功的哦。

海关进出口验证码学习相关推荐

  1. 【2022最新爬虫】JS逆向之采集某某海关进出口信用平台数据

    目录 目标网站: 分析流程 解密返回内容 扣代码本地运行 结尾和代码链接 小提示,代码在末尾哦!!!! 目标网站: (控制台运行) atob('aHR0cDovL2NyZWRpdC5jdXN0b21z ...

  2. 查询手机号段对应地区编码_想知道海关统计数据吗?这里有详细的查询教程

    海关统计数据在线查询系统优化升级了,系统更好用啦! 打开方式 1.进入海关总署官网www.customs.gov.cn,点击导航栏中的"信息公开". 2.点击左侧导航栏中的&quo ...

  3. lv官网编码查询_想知道海关统计数据吗?这里有详细的查询教程

    海关统计数据在线查询系统优化升级了,系统更好用啦! 打开方式 1.进入海关总署官网www.customs.gov.cn,点击导航栏中的"信息公开". 2.点击左侧导航栏中的&quo ...

  4. 国内第一本律师撰写的海关法律专业书籍-《企业如何应对海关行政处罚》-第五章...

    第五章 当企业遭遇申报不实 被海关认定"申报不实"往往是困扰企业尤其是海关信誉良好企业的一块心病,企业这种不知不觉状态下的违规是何原因造成?企业如何规避? 第一节 遭遇申报不实,企 ...

  5. aida64 extreme 序列号_轻声问海关,规范申报错了谁负责?底料来源四川行不行?没有公式定价行不行?序列号是料号行不行?...

    昨天天下大乱了,呵呵,大家都在吐槽 还有一大堆胖友怼胖剑我,说你咋不吐槽规范申报啊! 大哥啊,大姐啊,你们为啥不看昨天关务发布啊?我一早九点就开始写 你们说我没开炮,这不欺负人么? 好,那今天开个大炮 ...

  6. 使用腾讯云模板发送短信验证码

    目录 学习目标: 学习内容: 学习时间: 学习过程: demo结构图: 效果图: 配置准备: 依赖pom.xml application.properties: application.yml 腾讯云 ...

  7. 农产品进出口成都代办公司注册流程

    在成都怎么注册进出口农产品公司呢,该如何去办理相关的注册流程?农产品公司在成都我们应该如何去做呢?企博士财务就为各位老板整理了关于进出口农产品公司注册流程以及相关需要资料,看完本文你就一目了然了! 一 ...

  8. 海关查验会查些什么呢?

    海关查柜是会产生一些额外费用的,但这些费用不是海关收取的,而是码头收取的吊柜费.拆柜费等费用,因为是海关查验才有此费用,所以码头一般把这些费用称之为海关查验费,码头会开具正规发票的. 这些查柜费是由S ...

  9. 再次“重新定义” 华为争做数据基础设施领航者

    戳蓝字"CSDN云计算"关注我们哦! 数字经济是随着信息技术革命发展而产生的一种新的经济形态.近年来,随着我国开始更多从经济视角观察数字化问题,数字经济开始升温.7月31日,国家统 ...

最新文章

  1. 详细通俗重点CRF层讲解
  2. Retrofit 原理解析
  3. 一个帖子学会Android开发四大组件
  4. 返回一个二维整数数组中最大联通子数组的和
  5. 百度母婴技术团队—基于Reactjs实现webapp #1
  6. php 实现两变量值对换,php两个变量的值交换的方法
  7. pap chap认证配置
  8. [JavaWeb-MySQL]数据库的备份和还原
  9. 怎样在linux系统上安装r,Linux系统之路——如何在CentOS7.2安装R(示例代码)
  10. 书呆子rico_来自书呆子总书呆子的6条阅读建议
  11. 服务追踪系统_一键托管,阿里云全链路追踪服务正式商用:成本仅自建1/5或更少...
  12. oracle虚拟机怎么拖到windows,如何使用Virtualbox从Windows 10拖放到Ubuntu 18 VM
  13. Atitit.Base64编码原理与实现设计
  14. 《OpenCV3编程入门》毛星云编著
  15. 解决win7旗舰版无法卸载IE11,恢复系统原内置IE版本浏览器(本人原内置IE8)
  16. 计算机专业英文版模板简历,计算机专业英文简历模板
  17. 零基础怎样自学编程?初学者如何学习编程?编程学习入门指南(文章较长,需要耐心看完)
  18. 小鹿线前端课程怎么样
  19. 小心 transmittable-thread-local 的这个坑
  20. 苹果最强芯片M1 Ultra亮相!两个M1 Max胶水拼接,性能爆表

热门文章

  1. 不懂算法,进大厂,真香!
  2. vivo安全工程师面试_Java 架构师——阿里和vivo面试题目汇集(转)
  3. 揭阳疾控中心实验室装修事项
  4. UL线材表面印字有什么相关标准?
  5. python.nlp随笔(九)上下文无关文法
  6. 保定街道电表箱墙绘案例欣赏
  7. 实例讲解用.NET技术将Excel表格中的数据导入到特定的SQL Server数据库中
  8. 4D成像雷达“门槛升级”,点云处理+前融合感知大战打响
  9. 【OpenCV】双目测距(双目标定、双目校正和立体匹配)
  10. 版是什么版本的教材_铠甲勇士:3个版本的帝皇铠甲,为什么说“向阳”版的帝皇侠最强...