【Python实战】机型自动化标注(搜狗爬虫实现)
1. 引言
从安卓手机收集上来的机型大都为这样:
mi|5
mi|4c
mi 4c
2014022
kiw-al10
nem-tl00h
收集的机型大都杂乱无章,不便于做统计分析。因此,标注显得尤为重要。
中关村在线有对国内大部分手机的介绍情况,包括手机机型nem-tl00h及其对应的常见名称荣耀畅玩5C。因而,设计机型自动化标注策略如下:
- 在搜狗搜索中输入机型进行搜索,为了限定第一个返回结果为ZOL网站,加上限定词
site:detail.zol.com.cn; - 通过第一条返回结果的链接,跳转到相应的ZOL页面,解析拿到标注名称与手机别名。
2. 实现
根据上面的爬取策略,我用Python实现一个简单的爬虫:采用PyQuery解析HTML页面,PyQuery采用类似jQuery的语法来操作HTML元素,熟悉jQuery的人对PyQuery是上手即用。
Sogou爬虫的代码实现(基于Python 3.5.2)如下:
# -*- coding: utf-8 -*-
# @Time : 2016/8/8
# @Author : rain
import codecs
import csv
import logging
import re
import time
import urllib.parse
import urllib.request
import urllib.error
from pyquery import PyQuery as pq
def quote_url(model_name):
base_url = "https://www.sogou.com/web?query=%s"
site_zol = "site:detail.zol.com.cn "
return base_url % (urllib.parse.quote(site_zol + model_name))
def parse_sogou(model_name):
search_url = quote_url(model_name)
request = urllib.request.Request(url=search_url, headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/45.0.2454.101 Safari/537.36'})
sogou_html = urllib.request.urlopen(request).read()
sogou_dom = pq(sogou_html)
goto_url = sogou_dom("div.results>.vrwrap>.vrTitle>a[target='_blank']").eq(0).attr("href")
logging.warning("goto url: %s", goto_url)
if goto_url is None:
return None
goto_dom = pq(url=goto_url)
script_text = goto_dom("script").text()
zol_url = re.findall(r'\("(.*)"\)', script_text)[0]
return zol_url
def parse_zol(model_name):
zol_url = parse_sogou(model_name)
if zol_url is None:
return None, None
try:
zol_html = urllib.request.urlopen(zol_url).read()
except urllib.error.HTTPError as e:
logging.exception(e)
return None, None
zol_dom = pq(zol_html)
title = zol_dom(".page-title.clearfix")
name = title("h1").text()
alias = title("h2").text()
if u'(' in name and u')' in name:
match_result = re.match(u'(.*)((.*))', name)
name = match_result.group(1)
alias = match_result.group(2) + " " + alias
return name, alias
if __name__ == "__main__":
with codecs.open("./resources/data.txt", 'r', 'utf-8') as fr:
with open("./resources/result.csv", 'w', newline='') as fw:
writer = csv.writer(fw, delimiter=',')
for model in fr.readlines():
model = model.rstrip()
label_name, label_alias = parse_zol(model)
writer.writerow([model, label_name, label_alias])
logging.warning("model: %s, name: %s, alias: %s", model, label_name, label_alias)
time.sleep(10)
为了防止sogou封禁,每爬一次则休息10s。当然,这种爬取的速度会非常慢,需要做些优化。
3. 优化
下载验证码
sogou是通过访问频次来进行封禁,当访问次数过多时,会要求输入验证码:
<div class="content-box">
<p class="ip-time-p">IP:61...<br/>访问时间:2016.08.09 15:40:04</p>
<p class="p2">用户您好,您的访问过于频繁,为确认本次访问为正常用户行为,需要您协助验证。</p>
...
<form name="authform" method="POST" id="seccodeForm" action="/">
<p class="p4">
...
<input type="hidden" name="m" value="0"/> <span class="s1">
<a onclick="changeImg2();" href="javascript:void(0)">
<img id="seccodeImage" onload="setImgCode(1)" onerror="setImgCode(0)" src="util/seccode.php?tc=1470728404" width="100" height="40" alt="请输入图中的验证码" title="请输入图中的验证码"/>
</a>
</span>
<a href="javascript:void(0);" id="change-img" onclick="changeImg2();" style="padding-left:50px;">换一张</a>
<span class="s2" id="error-tips" style="display: none;"/>
</p>
</form>
...
</div>
通过分析html,真实的验证码图像需要做如下的拼接:
http://weixin.sogou.com/antispider/util/seccode.php?tc=1470728404
下载验证码图像到本地:
import urllib.request
from pyquery import PyQuery as pq
import re
for i in range(100):
html = urllib.request.urlopen("https://www.sogou.com/web?query=treant").read()
dom = pq(html)
img_src = dom("#seccodeImage").attr("src")
if img_src is not None:
img_name = re.search("tc=(.*)", img_src).group(1)
anti_img_url = "http://weixin.sogou.com/antispider/" + img_src
urllib.request.urlretrieve(anti_img_url, "./images/" + img_name + ".jpg")
tesseract识别验证码,识别的效果的一般,等以后有时间再考虑下其他识别方法。
【Python实战】机型自动化标注(搜狗爬虫实现)的更多相关文章
- Python实战:Python爬虫学习教程,获取电影排行榜
Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...
- 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程
点击了解更多Python课程>>> 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程 适用人群: 即将毕业的大学生,工资低工作重的白领,渴望崭露头角的职场新人, ...
- Python接口测试框架实战与自动化进阶☝☝☝
Python接口测试框架实战与自动化进阶☝☝☝ 一.fiddler在工作中的运用 1.如何抓接口 抓紧手机端接口 ①.在电脑终端输入:ipconfig ,找到电脑ip ②.打开手机,连接WiFi, ...
- Python接口测试框架实战与自动化进阶✍✍✍
Python接口测试框架实战与自动化进阶 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看 ...
- 再一波Python实战项目列表
前言: 近几年Python可谓是大热啊,很多人都纷纷投入Python的学习中,以前我们实验楼总结过多篇Python实战项目列表,不但有用还有趣,最主要的是咱们实验楼不但有详细的开发教程,更有在线开发环 ...
- Python实战:美女图片下载器,海量图片任你下载
Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...
- (转)Python新手写出漂亮的爬虫代码2——从json获取信息
https://blog.csdn.net/weixin_36604953/article/details/78592943 Python新手写出漂亮的爬虫代码2——从json获取信息好久没有写关于爬 ...
- (转)Python新手写出漂亮的爬虫代码1——从html获取信息
https://blog.csdn.net/weixin_36604953/article/details/78156605 Python新手写出漂亮的爬虫代码1初到大数据学习圈子的同学可能对爬虫都有 ...
- 自然语言处理之中文分词器-jieba分词器详解及python实战
(转https://blog.csdn.net/gzmfxy/article/details/78994396) 中文分词是中文文本处理的一个基础步骤,也是中文人机自然语言交互的基础模块,在进行中文自 ...
随机推荐
- java学习之接口、多态和内部类
接口是一组行为的规范.定义.接口是面向对象编程体系中的思想精髓之一,使用接口可以让我们的程序更加利于变化. 接口的格式: interface 接口名称{ 全局变量: 抽象方法: } 接口中的成员修饰符 ...
- SQL Server最近怎样了
SQL Server最近怎样了 又到年终了,大家都作最后冲刺 最近园子里真的多了很多口水帖,无论大家争论得多么激烈,时间依然滴答滴答地过,争论完之后我们依然要继续埋头苦干 为年终奖.为明年做准备 这里 ...
- 非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法
非域环境下搭建自动故障转移镜像无法将 ALTER DATABASE 命令发送到远程服务器实例的解决办法 环境:非域环境 因为是自动故障转移,需要加入见证,事务安全模式是,强安全FULL模式 做到最后一 ...
- Android安全开发之安全使用HTTPS
Android安全开发之安全使用HTTPS 1.HTTPS简介 阿里聚安全的应用漏洞扫描器中有证书弱校验.主机名弱校验.webview未校验证书的检测项,这些检测项是针对APP采用HTTPS通信时容易 ...
- 剑指Offer面试题:21.从上到下打印二叉树
一.题目:从上到下打印二叉树 题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印.例如输入下图中的二叉树,则依次打印出8.6.10.5.7.9.11. 二叉树节点的定义如下,采用 ...
- .NET垃圾回收(GC)原理
作为.NET进阶内容的一部分,垃圾回收器(简称GC)是必须了解的内容.本着“通俗易懂”的原则,本文将解释CLR中垃圾回收器的工作原理. 基础知识 托管堆(Managed Heap) 先来看MSDN的解 ...
- 单独使用jdbc编程问题总结(一)
在学习Mybatis之前,我们先来回顾JDBC编程的相关知识.在此基础上深入的学习Mybatis框架.如有错误,敬请指正. (一)首先我们既然要使用jdbc,当然是要操作数据库了.创建一个名为:myb ...
- 自定义view(二)
1.View 的绘制 通过继承View 并重写它的onDraw()来完成绘制. onDraw()有一个参数,就是Canvas对象.使用这个Canvas就可以绘制图像了,Canvas canvas = ...
- ES6新特性之 promise
新的ES6中引入了promise的概念,目的是让回调更为优雅.层层嵌套的回调会让javascript失去美感和可读性,同时javascript也推荐采用链式的方式去书写函数调用.于是Promise就应 ...
- iOS-UI-UI控件概述
以下列举一些在开发中可能用得上的UI控件: IBAction和IBOutlet,UIView 1 @interface ViewController : UIViewController 2 3 @p ...