爬虫学习1-概念及urllib2

前记:

  • 爬虫:使用任何技术手段,批量获取网站信息的一种方式。关键在于批量。

  • 反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。关键也在于批量。

  • 误伤:在反爬虫的过程中,错误的将普通用户识别为爬虫。误伤率高的反爬虫策略,效果再好也不能用。

  • 拦截:成功地阻止爬虫访问。这里会有拦截率的概念。通常来说,拦截率越高的反爬虫策略,误伤的可能性就越高。因此需要做个权衡。

  • 资源:机器成本与人力成本的总和。

url 管理器:管理待抓取url集合和已抓取url集合

个人:set(),python的set()可以自动去重

大量带爬取url:关系数据库mysql

互联网公司:缓存数据库(高性能)

网页下载器:

1.urllib2:python官方基础模块(py2.7)

下载方法:

1.直接下载


import urllib2

response = urllib2.urlopen(url)#直接下载

print response.getcode()#获取状态码

cont = response.read()#读取内容

2.伪装和密码


import urllib2

request = urllib2.Request(url)#创建request对象

request.add_data('a','l')#添加数据,a-l,诸如账号密码

request.add_header('User-Agent','Mozilla/5.0')#添加http的header,用于伪装

response = urllib2.urlopen(request)#发送请求获取结果

cont = response.read()#读取内容

3.复杂情景(加套子)

HTTPCookie用户登录情景/Proxy代理信息/HTTPS加密信息/Readirect防止URL互相跳转


import urllib2,cookielib

cj = cookielib.CookieJar()#创建cookie容器

opener = urllib2.builb_opener(urllib2.HTTPCookieProcessor(cj))#httpcookie用户登陆

urllib2.intall_opener(opener)#给urllib2安装opener

response = urllib2.urlopen(url)#使用带有cookie的urllib2爬取网页

2.urllib.request:(py3)

2.1 request.urlopen方法:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

  • urlopen无法判断数据的encoding,所以返回的是bytes对象。一般会对返回的数据进行decode。

  • url参数,可以是一个string,或者一个Request对象。

  • data一定是bytes对象,传递给服务器的数据,或者为None。目前只有HTTP requests会使用data,提供data时会是一个post请求,如若没有data,那就是get请求。data在使用前需要使用urllib.parse.urlencode()函数转换成流数据

urlopen方法:

  • read() , readline() ,readlines() , fileno() , close() :对HTTPResponse类型数据进行操作

  • info():返回HTTPMessage对象,表示远程服务器返回的头信息

  • getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到

  • geturl():返回请求的url

eg:


from urllib import request

req = request.urlopen('http://euraxluo.cn')

print(req.read().decode())#read()方法是读取返回数据内容,decode是转换返回数据的bytes格式为str 

2.2 urllib.request.Reques:

urllib.request.Request(url, data=None, headers={},origin_req_host=None, unverifiable=False, method=None)

eg:


import urllib.request

req=urllib.request.Request('http://euraxluo.cn')

with urllib.request.urlopen(req) as response:

    page=response.read(300).decode('utf-8')#我们获取的数据一般是ascii的,decode成utf-8.

print(page)

2.3 用来包装头部的数据:

  • User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言

百度图片

“Baiduspider-image+(+http://www.baidu.com/search/spider.htm)


百度最新UA如下:

PC:

Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)

移动:

Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)



360搜索

Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0);



360网站安全检测

360spider (http://webscan.360.cn)



Google

“Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)


Google图片搜索

“Googlebot-Image/1.0”



Adwords移动网络

“AdsBot-Google-Mobile (+http://www.google.com/mobile/adsbot.html) Mozilla (iPhone; U; CPU iPhone OS 3 0 like Mac OS X) AppleWebKit (KHTML, like Gecko) Mobile Safari”



微软 bing,必应

“Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)


腾讯搜搜

“Sosospider+(+http://help.soso.com/webspider.htm)


搜搜图片

“Sosoimagespider+(+http://help.soso.com/soso-image-spider.htm)


雅虎英文

“Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)


雅虎中国

“Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)


搜狗图片

“http://pic.sogou.com” “Sogou Pic Spider/3.0(+http://www.sogou.com/docs/help/webmasters.htm#07)


搜狗

“Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)


网易有道

“Mozilla/5.0 (compatible; YoudaoBot/1.0; http://www.youdao.com/help/webmaster/spider/; )


瑞典 Speedy Spider

“Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) Speedy Spider (http://www.entireweb.com/about/search_tech/speedy_spider/)


俄罗斯 yandex

“Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)


宜搜 EasouSpider

Mozilla/5.0 (compatible; EasouSpider; +http://www.easou.com/search/spider.html)



华为赛门铁克蜘蛛

“HuaweiSymantecSpider/1.0+DSE-support@huaweisymantec.com+(compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR ; http://www.huaweisymantec.com/cn/IRL/spider)
华为赛门铁克科技有限公司网页信誉分析系统的一个页面爬取程序,其作用是用于爬取互联网网页并进行信誉分析,从而检查该网站上的是否含有恶意代码。



七牛镜像蜘蛛

qiniu-imgstg-spider-1.0



监控宝

“Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; JianKongBao Monitor 1.1)


DNSPod监控

DNSPod-Monitor/2.0
  • Referer:可以用来防止盗链,有一些网站图片显示来源http://*.com,就是检查Referer来鉴定的

  • Connection:表示连接状态,记录Session的状态


#urllib.request.Request(url, data=None, headers={}, method=None)

#使用request()来包装请求,再通过urlopen()获取页面。

2.4 Post数据

  • urlopen()的data参数默认为None,当data参数不为空的时候,urlopen()提交方式为Post

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

`

urlencode()主要作用就是将url附上要提交的数据。

  • Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码

page = request.urlopen(req, data=data).read()

当然,也可以把data的数据封装在urlopen()参数中

data = {'first': 'true',}

data = parse.urlencode(data).encode('utf-8')

  • eg:

import urllib.parse as up

import urllib.request as ur

url = 'http://www.uustv.com/'

values = {'word': 'Euraxluo','sizes': '60','fonts': 'jfcs.ttf','fontcolor': '#000000'}#Post的数据

data = up.urlencode(values)#编码

data = data.encode('ascii')#解码,server,只接受ascii数据

req = ur.Request(url,data)

with ur.urlopen(req) as response:

    page = response.read().decode('utf-8')  #我们获取的数据一般是ascii的,decode成utf-8.

print(page)

2.5 使用代理

  • 当需要抓取的网站设置了访问限制,这时就需要用到代理来抓取数据

urllib.request.ProxyHandler(proxies=None)

  • eg:

proxy = urllib.request.ProxyHandler({'http': 'ip'})  # 设置proxy

opener = urllib.request.build_opener(proxy)  # 挂载opener

urllib.request.install_opener(opener)  # 安装opener

data = urllib.parse.urlencode(data).encode('utf-8')#下载

CC BY-NC 4.0

爬虫学习2-Requests库学习
RabbitMQ-入门

Comments