首页 今日头条 正文

车牌识别,手把手教你用Python爬虫技术爬页面(附编码),多多影院

导读:本文首要分为两个部分:一部分是网络爬虫的概述,协助咱们详细了解网络爬虫;另一部分是HTTP恳求的Python完成,协助咱们了解Python中完成HTTP恳求的各种办法,以便具有编写HTTP网络程序的才干。

作者:范传辉

如需转载请联络篇章科技

01 网络爬虫概述

接下来从网络爬虫的概念、用途与价值和结构等三个方面,让咱们对网络爬虫有一个根本的了解。

1. 网络爬虫及其运用

跟着网络的迅速发展,万维网成为很多信息的载体,怎么有用地提取并运用这些信息成为一个巨大的应战,网络爬虫应运而生。网络爬虫(又被称为网页蜘蛛、网络机器人),是一种依照必定的规矩,主动地抓取万维网信息的程序或许脚本。下面经过图3-1展现一下网络爬虫在互联网中起到的作用:

▲图3-1 网络爬虫

网络爬虫依照体系结构和完成技能,大致能够分为以下几种类型:通用网络爬虫、聚集网络爬虫、增量式网络爬虫、深层网络爬虫。实践的网络爬虫体系通常是几种爬虫技能相结合完成的。

查找引擎(Search Engine),例如传统的通用查找引擎baidu、Yahoo和Google等,是一种大型杂乱的网络爬虫,归于通用性网络爬虫的范畴。可是通用性查找引擎存在着必定的局限性:

  1. 不同范畴、不同布景的用户往往具有不同的检索意图和需求,通用查找引擎所回来的成果包括很多用户不关怀的网页。
  2. 通用查找引擎的方针是尽或许大的网络掩盖率,有限的查找引擎服务器资源与无限的网络数据资源之间的对立将进一步加深。
  3. 万维网数据办法的丰厚和网络技能的不断发展,图片、数据库、音频、视频多媒体等不同数据很多呈现,通用查找引擎往往对这些信息含量密布且具有必定结构的数据力不从心,不能很好地发现和获取。
  4. 通用查找引擎大多供给依据要害字的检索,难以支撑依据语义信息提出的查询。

为了处理上述问题,定向抓取相关网页资源的聚集爬虫应运而生。

聚集爬虫是一个主动下载网页的程序,它依据既定的抓取方针,有选择地拜访万维网上的网页与相关的链接,获取所需求的信息。与通用爬虫不同,聚集爬虫并不寻求大的掩盖,而将方针定为抓老人与海读书笔记取与某一特定主题内容相关的网页,为面向主题的用户查询预备数据资源。

说完了聚集爬虫,接下来再说一下增量式网络爬虫。增量式网络爬虫是指对已下载网页采纳增量式更新和只匍匐新发作的或许高兴大本营20150502现已发作变化网页的爬虫,它能够在必定程度上确保所匍匐的页面是尽或许新的页面。

和周期性匍匐和改写页面的网络爬虫比较,增量式爬虫只会在需求的时分匍匐新发作或发作更新的页面,并不从头下载没有发作变化的页面,可有用削减数据下载量,及时更新已匍匐的网页,减小时刻和空间上的消耗,可是增加了匍匐算法的杂乱度和完成难度。

例如:想获取赶集网的招聘信息,曾经爬取过的数据没有必要重复爬取,只需求获取更新的招聘数据,这时分就要用到增量式爬虫。

终究说一下深层网络爬虫。Web页面按存在办法能够分为表层网页和深层网页。表层网页是指传统查找引擎能够索引的页面,以超链接能够抵达的静态网页为主构成的Web页面。深层网络是那些大部分内容不能经过静态链接获取的、隐藏在查找表单后的,只需用户提交一些要害词才干取得的Web页面。

例如用户登录或许注册才干拜访的页面。能够幻想这样一个场景:爬取贴吧或许论坛中的数据,有必要在用户登录后,有权限的状况下才干获取完好的数据。

2. 网络爬虫结构

下面用一个通用的网络爬虫结构来阐明网络爬虫的根本作业流程,如图3-4所示。

▲图3-4 网络爬虫结构

网络爬虫的根本作业流程如下:

  1. 首要让选取一部分精心选择的种子URL。
  2. 将这些URL放入待抓取URL行列。
  3. 从待抓取URL行列中读取待抓取行列的URL,解析DNS,并且得到主机的IP,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL行列。
  4. 剖析已抓取URL行列中的URL,从已下载的网页数据中剖分出其他URL,并和已抓取的URL进行比较去重,终究将去重过的URL放入待抓取URL行列,然后进入下一个循环。

02 HTTP恳求的Python完成

经过上面的网络爬虫结构,咱们能够看到读取URL、下载网页是每一个爬虫必备并且要害的功用,这就需求和HTTP恳求打交道。接下来解说Python中完成HTTP恳求的三种办法:urllib2/urllib、httplib/urllib以及轿车Requests。

1. urllib2/urllib完成

urllib2和urllib是Python中的两个内置模块,要完成HTTP功用,完成办法是以urllib2为主,urll口琴ib为辅。

1.1 首要完成一个完好的恳求与呼应模型

urllib2供给一个根底函数urlopen,经过向指定的URL宣布恳求来获取数据。最简略的办法是:

import urllib2
response=urllib2.urlopen('http://www.zhihu.com')
html=response.read()
print html

其实能够将上面临http://www.zhihu.com的恳求呼应分为两步,一步是恳求,一步是呼应,办法如下:

import urllib2
# 恳求
request=urllib2.Request('http://www.zhihu.com')
# 呼应
response = urllib2.urlopen(request)
html=response.read()
print html

上面这两种办法都是GET恳求,接下来演示一下POST恳求,其实迥然不同,仅仅增加了恳求数据,这时分用到车牌辨认,手把手教你用Python爬虫技能爬页面(附编码),多多影院了urllib。示例如下:

import urllib
import urllib2
url = 'http://www.xxxxxx.com/login'
postdata = {'username' : 'qiye',
'password' : 'qiye_pass'}
# info 需求被编码为urllib2能了解的格局,这儿用到的是urllib
data = urllib.urlencode(postdata)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
html = response.read()

可是有时会呈现这种状况:即便POST恳求的数据是对的,可是服务器回绝你的拜访。这是为什么呢?问题出在恳求中的头信息,服务器会查验恳求头,来判别是否是来自浏览器的拜访,这也是反爬虫的常用手法。

1.2 恳求头headers处理

将上面的比方改写一下,加上恳求头信息,设置一下恳求头中的User-Agent域和莉莉Referer域信息。

import urllib
import urllib2
url = 'http://www.xxxxxx.com/login'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
referer='http://www.xxxxxx.com/'
p车辆违章ostdata = {'username' : 'qiye',
'password' : 'qiye_pass'}
# 将user_agent,referer写入头信息
headers={'User-Agent':user_agent,'Referer':referer}
data = urllib.urlencode(postdata)
req = urllib2.Request(url, data,headers)
response = urllib2.urlopen(req)
html = response.read()

也能够这样写,运用add_header来增加恳求头信息,夏红全修正如下:

import urllib
import urllib2
url = 'http://www.xxxxxx.com/login'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
referer='http://www.xxxxxx.com/'
postdata = {'username' : 'qiye',
'password' : 'qiye_pass'}
data = urllib.urlencode(postdata)
req = urllib2.Request(url)
# 将user_agent,referer写入头信息
req.add_header('User-Agent',user_agent)
req.add_header('Referer',referer)
req.add_data(data)
response = urllib2.urlopen(req)
html = response.read()

对有些header要特别留心,服务器会针对这些header做检查,例如:

  • User-Agent:有些服务器或Proxy会经过该值来判别是否是浏览器宣布的恳求。
  • Content-Type:在运用REST接口时,服务器会检查该值,用来确认HTTP Body中的内容该怎样解析。在运用服务器供给的RESTful或SOAP服务时,Content-Type设置过错解导致服务器回绝服务。常见的取值有:application/xml(在XML RPC,如RESTful/SOAP调用时运用)、application/json(在JSON RPC调用时运用)、application/x-www-form-urlencoded(浏览器提交Web表单时运用)。
  • Referer:服务器有时分会检查防盗链。

1.3 Cookie处理

urllib2对Cookie的处理也是主动的,运用CookieJar函数进行Cookie的办理。假如需求得到某个Cookie项的值,能够这么做:

import urllib2
import cookielib
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open('http://www.zhihu.com')
for item in cookie:
print item.name+':'+item.value

可是有时分会遇到这种状况,咱们不想让urllib2主动处理,咱们想自己增加Cookie的内容,能够经过设置恳求头中的Cookie域来做:

import urllib2
opener = urllib2.build_opener()
opener.addheaders.append( ( 'Cookie', 'email=' + "xxxxxxx@163.com" ) )
req = urllib2.Request( "http://www.zhihu.com/" )
response = opener.open(req)
print response.headers
retdata = res西贝ponse.read()

1.4 Timeout设置超时

在Python2.6之前的版别,urll全才儿子邪佞妃ib2的API并没有露出Timeout的设置,要设置Timeout值,只能更改Socket的大局Timeout值。示例如下:

import urllib2
import socket
socket.setdefaulttimeout(10) # 10 秒钟后超时
urllib2.socket.setdefaulttimeout(10) # 另一种办法

在Python2.6及新的版别中,urlopen函数供给了对Timeout的设置,示例如下:

import urllib2
request=urllib2.Request('http://www.zhihu.com')
response = urllib2.urlopen(request,timeout=2)
html=response.read()
print html

1.5 获取HTTP呼应码

关于200 OK来说,只需运用urlopen回来的response目标的getcode()办法就能够得到HTTP的回来码。但对其他回来码来说,urlopen会抛出反常。这时分,就要检查反常目标的code特点了,示例如下:

import urllib2
try:
response = urllib2.urlopen('http://www.goo车牌辨认,手把手教你用Python爬虫技能爬页面(附编码),多多影院gle.com')
print response
except urllib2.HTTPError as e:
if hasattr(e, 'code'):
pripleasurent 'Error code:',e.code

1.6 重定向

urllib2默许状况下会针对HTTP 3XX回来码主动进行重定向动作。要检测是否发作了重定向动作,只需检查一下Response的URL和Request的URL是否共同就能够了,示例如下:

import urllib2
response = urllib2.urlopen('http://www.zhihu.cn')
isRedirected = response.geturl() == 'http://www.zhihu.cn'

假如不想主动重定向,能够自定义HTTPRedirectHandler类,示例如下:

import urllib2
class RedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_301(self, req, fp, code, msg, headers):
pass
def http_error_302(self, req, fp, code, msg, headers):
result = urllib2.HTTPRedirectHandler.http_error_301(self, req, fp, code,
msg, headers)
result.status = code
result.newurl = result.geturl()
return result
opener = urllib2.build_opener(RedirectHandler)
opener.open('http://www.zhihu.cn')

1.7 Proxy的设置

在做爬虫开发中,必不可少地会用到署理。urllib2默许会运用环境变量http_proxy来设置HTTP Proxy。可是咱们一般不选用这种办法,而是运用ProxyHandler在程序中动态设置署理,示例代码如下:

import urllib2
proxy = urllib2.ProxyHandler({'http': '127.0.0.1:8087'})
opener = urllib2.build_opener([proxy,])
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.zhihu.com/')
pri我国农林卫视网nt response.read()

这儿要注意的一个细车牌辨认,手把手教你用Python爬虫技能爬页面(附编码),多多影院节,运用urllib2.install_opener()会设置urllib2的大局opener,之后一切的HTTP拜访都会运用这个署理。这样运用会很便利,但不能做更细粒度的操控,比方想在程序中运用两个不同的Proxy设置,这种场景在爬虫中很常见。比较好的做法是不运用install_opener去更改大局的设置,而仅仅直接调用opener的open办法替代大局的urlopen办法,修正如下:

import urllib2
proxy = urllib2.ProxyHandler({'http': '127.0.0.1:8087'})
opener = urllib2.build_opener(proxy,)
response = opener.open("http://www.zhihu.com/")
print response.read()

2. httplib/urllib完成

httplib模块是一个底层根底模块,能够看到树立HTTP恳求的每一步,可是完成的功用比较少,正常状况下比较少用到。在Python爬虫开发中根本上用不到,所以在此仅仅进行一下常识遍及。下面介绍一下常用的目标和函数:

  • 创立HTTPConnection目标:
  • class httplib.HTTPConnection(host[, port[, strict[, timeout[, source_address]]]])。
  • 发送恳求:
  • HTTPConnection.request(method, url[, body[, headers]])。
  • 取得呼应:
  • HTTPConnection.getresponse()。
  • 读取呼应信息:
  • HTTPResponse.read([amt])。
  • 取得指定头信息:
  • HTTPResponse.getheader(name[, default])。
  • 取得呼应头(header, value)元组的列表:
  • HTTPResponse.getheaders()。
  • 取得底层socket文件描述符:
  • HTTPResponse.fileno()。
  • 取得头内容:
  • HTTPResponse.msg。
  • 取得头http版别:
  • HTTPResponse.version。
  • 取得回来状况码天伦之乐:
  • HTTPResponse.status。
  • 取得回来阐明:
  • HTTPResponse.reason。

接下来演示一下GET恳求和POST恳求的发送,首要是GET恳求的示例,如下所示:

import httplib
conn =None
try:
conn = httplib.HTTPConnection("www.zhihu.com")
conn.request("GET", "/")
response = conn.getresponse()
print response.status, response.reason
print '-' * 40
headers = response.getheaders()
for h in headers:
print h
print '-' * 40
print response.msg
except Exception,e:
print e
finally:
if conn:
conn.close()

POST恳求的示例如下:

import httplib, urllib
co赛罗奥特曼大电影nn = None
try:
params = urllib.urlencode({'name': 'qiye', 'age': 22})
headers = {"Content-type": "application/x-www-form-urlencoded"
, "Accept": "text/plain"}
conn = httplib.HTTPConnection("www.zhihu.com", 80, timeout=3)
conn.request("POST", "/login", params,越狱兔 headers)
response = conn.getresponse()
print response.getheaders() # 获取头信息
print response.status
print response.read()
except Exception, e:
print e
finally:
if conn:
conn.close()

3. 更人性化的Requests

Python中Requests完成HTTP恳求的办法,是自己极力引荐的,也是在Python爬虫开发中最为常用的办法。Requests完成HTTP恳求十分简略,操作愈加人性化。

Requests库是第三方模块,需求额定进行装置。Requests是一个开源库,源码坐落:

Gi车牌辨认,手把手教你用Python爬虫技能爬页面(附编码),多多影院tHub: https://github.com/kennethreitz/requests

期望咱们多多支撑作者。

运用Requests库需求先进行装置,一般有两种装置办法:

  • 运用pip进行装置,装置指令为:pip install requests,不过或许不是最新版。
  • 直接到GitHub上下载Requests的源代码,下载链接为:
  • https://github.com/kennethreitz/requests/releases
  • 将源代码压缩包进行解压,然后进入解压后的文件夹,运转setup.py文件即可。

怎么验证Requests模块装置是否成功呢?在Python的shell中输入import requests,假如不报错,则是装置成功。如图3-5所示。

▲图3-5 验证Requests装置

3.1 首要仍是完成一个完好的恳求与呼应模型

以GET恳求为例,最简略的办法如下:

import requests
r = requests.get('http://www.baidu.com')
print r.content

咱们能够看到比urllib2完成办法的代码量少。接下来演示一下POST恳求,同样是十分简略,愈加具有Python风格。示例如下:

import requests
postdata={'key':'value'}
r = requests.post('http://www.xxxxxx.com/login',data=postdata)
print r.content

HTTP中的其他恳求办法也能够用Requests来完成,示例如下:

r = requests.put('http://www.xxxxxx.com/put', data = {'key':'value'})
r = requests.delete('http://www.xxxxxx.com/delete')
r = requests.head('http://www.xxxxxx.com/get')
r = requests.options('http://www.xxxxxx.com/get')

接着解说一下略微杂乱的办法,咱们必定见过类似这样的URL:

http://zzk.cnblogs.com/s/blogpost?Keywords=blog:qiyeboy&pageindex=1

就是在网址后边紧跟着“?”,“?”后边还有参数。那么这样的GET恳求该怎么发送呢?必定有人会说,直接将完好的URL带入即可,不过Requests还供给了其他办法,示例如下:

import requests
payload = {'Keywords': 'blog:qiyeboy','pageindex':1}
r = requests.get('http://zzk.cnblogs.com/s/blogpost', params=payload)
print r.url

经过打印成果,咱们看到终究的URL变成了:

http://zzk.cnblogs.com/s/blogpost?Keywords=blog:qiyeboy&pageindex=1

3.2 呼应与编码

仍是从代码下手,示例如下:

import requests
r = requests.get('http://www英俊图片.baidu.com')
print 'content-->'+r.content
print 'text-->'+r.text
print 'encoding-->'+r.encoding
r.encoding='utf-8'
print 'new text-->'+r.text

其间r.content回来的是字节办法,r.text回来的是文本办法,r.encoding回来的是依据HTTP头猜想的网页编码格局。

输出成果中:“text-->”之后的内容在操控台看到的是乱码,“encoding-->”之后的内容是ISO-8859-1(实践上的编码格局是UTF-8),由于Requests猜想编码过错,导致解析文本呈现了乱码。Requests供给了处理方案,能够自行设置编码格局,r.encoding='utf-8'设置成UTF-8之后,“new text-->”的内容就不会呈现乱码。

可是这种手动的办法略显蠢笨,下面供给一种愈加简洁的办法:chardet,这是一个十分优异的字符串/文件编码检测模块。装置办法如下:

pip install chardet

装置完成后,运用chardet.detect()回来字典,其间confidence是检测精确度,encoding是编码办法。示例如下:

import requests
r = requests.get('http://www.baidu.com')
print chardet.detect(r.content)
r.encoding = chardet.detect(r.content)['encoding']
print r.text

直接将chardet探测到的编码,赋给r.encoding完成解码,r.text输出就不会有乱码了。

除了上面那种直接获取悉数呼应的办法,还有一种流形式,示例如下:

import requests
r = requests.get('http://www.baidu.com',stream=True)
print r.raw.read(10)

设置stream=True标志位,使呼应以字节省办法进行读取,r.raw.read函数指定读取的字节数。

3.3 恳求头headers处理

Requests对headers的处理和urllib2十分类似,在Requests的get函数中增加headers参数即可。示例如下:

import requests
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers={'User-Agent':user_agent}
r = requests.get('http://www.baidu.com',headers=headers)
print r.content

3.4 呼应码code和呼应头headers处理

获取呼应码是运用Requests中的status_code字段,获取呼应头运用Requests中的headers字段。示例如下:

import requests
r = requests.get('http://www.baidu.com')
if r.status_code == requests.codes.ok:
print r.status_code# 呼应码
print r.headers# 呼应头
print r.headers.get('content-type')# 引荐运用这种获取办法,获取其间的某个字段
print r.headers['content-type']# 不引荐运用这种获取办法
else:
r.raise_for_status()

上述程序中,r.headers包括一切的呼应头信息,能够经过get函数获取其间的某一个字段,也能够经过字典引证的办法获取字典值,可是不引荐,由于假如字段中没有这个字段,第二种办法会抛出反常,第一种办法会回来None。

r.raise_for_status()是用来主动地发作一个反常,当呼应码是4XX或5XX时,raise_for_status()函数会抛出反常,而呼应码为200时,raise_for_status()函数回来None。

3.5 Cookie处理

假如呼应中包括Cookie的值,能够如下办法获取Cookie字段的值,示例如下:

import requests
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers={'User-Agent':user_agent}
r = requests.get('http://www.baidu.com',headers=head车牌辨认,手把手教你用Python爬虫技能爬页面(附编码),多多影院ers)
# 遍历出一切的cookie字段的值
for cookie in r.cookies.keys():
print cookie+':'+r.cookies.get(cookie)

假如想自定义Cookie值发送出去,能够运用以下办法,示例如下:

import requests
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers={'User-Agent':user_agent}
cookies = dict(name='qiye',age='10')
r = requests.get('http://www.baidu.com',headers=headers,cookies齐鲁银行=cookies)
print r.text

还有一种愈加高档,且能主动处理Cookie热带夜的办法,有时分咱们不需求关怀Cookie值是多少,仅仅期望每次拜访的时分,程序主动把Cookie的值带上,像浏览器相同。Requests供给了一个session的概念,在接连拜访网页,处理登录跳转时特别便利,不需求重视详细细节。运用办法示例如下:

import Requests
oginUrl = 'http://www.xxxxxxx.com/login'
s = requests.Session()
#首要拜访登录界面,作为游客,服务器会先分配一个cookie
r = s.get(loginUrl,allow_redirects=True)
datas={'name':'qiye','passwd':'qiye'}
#向登录链接发送post恳求,验证成功,游客权限转为会员权限
r = s.post(loginUrl, data=datas,allow_redirects= True)
print r.text

上面的这段程序,其实是正式做Python开发中遇到的问题,假如没有第一步拜访登录的页面,而是直接向登录链接发送Post恳求,体系会把你作为不合法用户,由于拜访登录界面时会分配一个Cookie,需求将这个Cookie在发送Post恳求时带上,这种运用Session函数处理Cookie的办法之后会很常用。

3.6 重定向与前史信息

处理重定向仅仅需求设置一下allow_redirects字段即可,例如:

r=requests.get('http://www.baidu.com',allow_redirects=True)

将allow_redirects设置为True,则是答应重定向;设置为False,则是制止重定向。假如是答应重定向,能够经过r.history字段检查前史信息,即拜访成功之前的一切恳求跳转信息。示例如下:

import requests
r = requests.get('http://github.com')
print r.url
print r.status_code
print r.history

打印成果如下:

https://github.com/
200
(,)

上面的示例代码显现的作用是拜访GitHub网址时,会将一切的HTTP恳求悉数重定向为HTTPS。

3.7 超时设置

超时选项是经过参数timeout来进行设置的,示例如下:

requests.get('http://github.com', timeout=车牌辨认,手把手教你用Python爬虫技能爬页面(附编码),多多影院2)

3.8 署理设置

运用署理Proxy,你能够为恣意恳求办法经过设置proxies参数来装备单个恳求:

import requests
proxies = {
"http": "http://0.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)

也能够经过环境变量HTTP_PROXY和HTTPS_PROXY?来装备署理,可是在爬三d虫开发中不常用。你的署理需求运用HTTP Basic Auth,能够运用http://user:password@host/语法:

proxies = {
"http": "http://user:pass@10.10.1.10:3128/",
}

03 小结

本文首要解说了网络爬虫的结构和运用,以及Python完成HTTP恳求的几种办法。期望咱们对本文中的网络爬虫作业流程车牌辨认,手把手教你用Python爬虫技能爬页面(附编码),多多影院和Requests完成HTTP恳求的办法要点吸收消化。

关于作者:范传辉,资深网虫,Python开发者,参加开发了多项网络运用,在实践开发中积累了丰厚的实战经验,并长于总结,贡献了多篇技能文章广受好评。研讨爱好是网络安全、爬虫技能、数据剖析、驱动开发等技能。

本文摘编自《Python爬虫开发与项目实战》,经出书方授权发布。

延伸阅览《Python爬虫开发与项目实战》

引荐语:零根底学习爬虫技能,从Python和Web前端根底开端讲起,由浅入深,包括很多事例,实用性强。

相关推荐

  • 暂无相关文章