Pythone爬虫学习入门一

tech2022-12-29  123

Pythone爬虫学习

入门案例

首先确定好请求对象

import requests #导入requests包 url ='http://www.baidu.com' strhtml = requests.get(url) #Get方式获取网页数据 print(strhtml.text) #strhtml 是url对象,但是使用.text就表示是网页源码

urlilb2.rulopen()

response =urllib2.rulopen(url,data,timeout)

url 即URL 必须填data,默认为Nonetimeiout 超时时间 默认为socket_GLOBAL_DEFAULT_TIMEOUT

执行这个urlopen方法之后,返回的是一个response对象,返回的信息都保存在这里面

response有一个read方法,可以获取到网页的内容

其实url还可以被封装在request中 例如:request=urllib2.Request(url) 再将reqeuest作为参数放到rulopen方法中

推荐使用这种方式,因为在构建请求的时候i还需要加入很多内容,通过构建一个request,服务器响应请求得到应答,这样才显得逻辑清晰


POST和GET数据传输

#`post` import urllib import urllib2 values={"username":"lilyzhengkai@163.com","password":"xxx"} data=urllib.urlencode(values) url="http://xxxxx" request =urllib2.Request(url,data) response=urllib2.urlopen(reqest) print response.read() #get values=[] values['usernaem']="lilyzhengkai@163.com" values['password']="xxxx" data=urllib.urlencode(values) url="http://xxxxx" geturl= url+"?"+data request=urllib2.Request(geturl) response=urllib2.urlopen(request) print response.read()

我们需要定义一个字典,名i在为values ,使用urlencode 方法将字典进行编码,命名为data,构建request传入两个参数,url,和data ,get 和post的区别也就是传参的区别,get使用?去拼接参数,而post将字典解析为data,再传到request


设置Headers

在浏览器的Header中,reqeustHeader中有一个user-agent 就是请求的身份,如果没有写入请求身份,那么服务器一定不会响应,所以可以在headers中设置agent

import urllib import urllib2 url ='http://xxxxx' user_agent='Mozilla/4.0(compatible; MSIE 5.5; Window NT)' values={'username':'xxx','password':'xxxxx'} headers={'User-Agent':user_agent} data=urllib.urlencode(values) request=urllib2.Request(url,data,headers) #将headers请求头信息填进去 .....

当我们这样设置了一个headers,在构建request时传入,在请求时,就加入了一headers传送,服务器若识别了是浏览器发来的请求,就会得到响应

防盗链 服务器会识别headers中的referer是不是它自己,如果不是,有的服务器不会响应,所以我们还可以看在header是中加入referer

headers={'User-Agent''Mozilla/4.0(compatible; MSIE 5.5;Window NT)','Referer':'http://xxxxxx'}

Proxy (代理)

urllib2 默认会使用环境变量 http_proxy 来设置Http Proxy 加入一个网站检测某段时间某个Ip的访问次数,如果访问次数过多,会禁止访问,所以可以设置一些代理服务器来帮助工作

import urllib2 enable_proxy =True proxy_handler=urllib2.ProxyHandler({"http":'http://some-proxy.com:8080'}) null_proxy_handler=urllib2.ProxyHandler({}) if enable_proxy: opener=urllib2.build_opener(proxy_handler) else: opener=urllib2.build_opener(null_proxy_handler) urllib2.install_opener(opener)

使用DebugLog

我们可以通过DebugLog,将收法宝的内容打印到屏幕上,方便调试

import urllib2 httpHandler=urllib2.HTTPHandler(debugleve=1) httpsHandler = urllib2.HTTPSHandler(debuglevel=1) opener=urllib2.build_opener(httpHandler,httpsHandler) urllib2.install_opener(opener) response=urllib2.urlopen('http://www.baidu.com')

异常处理

URLError

可能产生原因:

网络无连接链接不到特定的服务器服务器不存在 import urllib2 request=urllib2.Request('http://xxxxx') try: urllib2.urlopen(request) except urllib2.URLError as e: print e.reason

使用try-except语句包围并捕获相应的异常


HTTPError

当我们利用urlopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中它包含一个数字状态码,若是urllib2无法处理的,urlopen会产生一个HTTPError,对应相应的状态码

100: 继续101: 转换协议102: 继续处理200: 请求成功201: 请求完成202:请求被接受,但尚未处理完成204: 服务器已经实现了请求,但是没有返回新的信息301: 请求到的资源都会分配一个永久的URL,以后通过该URL来访问此资源 处理方式:重定向分配到的URL302: 请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时URL304: 请求的资源未更新 处理方式:丢弃400: 非法请求 处理方式:丢弃401未授权: 处理方式:丢弃403:禁止 处理方式:丢弃404:没有找到服务 处理方式:丢弃500: 服务器内部错误501:错误无法识别,服务器不支持当前请求所需的某个功能502: 错误网关503: 服务出错,可能由于临时的服务器维护或者过载

HTTError实例会产生一个code属性,这就是服务器发送的相关错误号

因为urllib2可以为你处理重定向,也就是3开头的代号可以被处理,并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码,当我们捕获的异常是HTTPError,它会带有一个code 属性,就是错误代号,同时我们还可以打印reason属性,这是它的父类URLError的属性

except urllib2.URLError as e: print e.code print e.reason

Cookie的使用

Opener

opener也就是urlopen是默认的创建一个opener实例,但他是opener的一个特殊实例,传入的参数仅仅是url,data,timeout

但是当我们需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建一更一般的opener来实现对Cookie的设置

Cookielib

cookielib模块主要作用是提供可存储的cookie的对象,以便于urllib2模块配合使用来访问internet资源,Cookielib模块非常强大,我们可以利用模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送

获取Cookie保持到变量

import urllib2 import cookielib cookie=cookielib.CookieJar() #声明一个CookieJar对象实例来保持cookie handler=urllib2.HTTPCookieProcessor(cookie) #利用urllib2库的HTTPCookieProcessor 对象来创建cookie处理器 opener=urllib2.build_opener(handler) #通过handler来稿件一个opener response=opener.open('http://www.baidu.com') for item in cookie: print 'Name:'+item.name+'value:'+item.value

保存Cookie到文件

import cookielib import urllib2 filename='cookie.txt' #设置cookie的文件,同级目录下的cookie.txt cookie=cookielib.MozillaCookieJar(filename) #声明一个对象实例来保存cookie,之后写入文件 handler=urllib2.HTTPCookieProcessor(cookie) #利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器 opener=urllib2.build_opener(handler) #通过handler来构建opener response=opener.open("http://www.baidu.com") cookie.save(ignore_discard=True,ignore_expires=True) #将Cookie保存到文件

从文件中获取到Cookie并访问

import cookielib import urllib2 cookie = cookielib.MozillaCookieJar() #创建MozillaCookieJar实例对象 cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True) #从文件中读取cookie内容到变量 req = urllib2.Request("http://www.baidu.com") #创建请求的request opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) #利用urllib2的build_opener方法创建一个opener response = opener.open(req) print response.read()

我们可以将cookie保存到文件中,如果以后想使用,可以利用该方法来读取cookie并访问网站

最新回复(0)