urllib发送数据和对反爬虫的处理 ----------python的爬虫学习

------------------urllib中发送数据------------------
urllopen方法中不能直接添加head和cookie等内容 在urllopen之前其实还有一个操作,来实例化对象,为其添加一些cookie和head以及设置发送 数据的方法.... urllib.request.Request(url,data=None,headers=None,origin_req_host=None,unverifiable=False, method=None)
参数说明:
url: 用于请求URL,这是必传参数,其他都是可选参数。
data: 必须传bytes(字节流)类型的。需要通过urllib.parse模块利得urlencode( )编码。
headers:字典,可以在构造请求时通过headers参数直接构造。字典中一般放置User­Agent(用
户代理)和cookie(临时身份证)
origin_req_host: 指的是请求方的host名称或者IP地址。
unverifiabl: e表示这个请求是无法验证的,默认是False,意思就是说用户没有足够的权限来选
择接收这个请求的结果。
method: 是一个字符串,用来指示请求使用的方法,比如GET、POST和PUT等。
在这其中常用的参数有headers、data、method
data使用实例 data传输的数据为bytes型的可以用urllib.parse的urlencode方法
GET的方式发送的数据是在链接当中的,我们需要通过拼接字符串去获取数据,发送的数据需
要通过编码才能拼接来使用
urllib.parse的urlencode方法编码和parse_qs对编码内容进行解码
 
实例:
data={'wd':'python'}
data=urllib.parse.urlencode(data)
data
'wd=python'
data=urllib.parse.parse_qs(data)
data
{'wd': ['python']}
 
实例:
url = 'https://www.baidu.com/s?'
import urllib.parse
from urllib import request
data={'wd':'python'}
data=urllib.parse.urlencode(data)
url=url+data
a = request.Request(url=url)
a.add_header('User‐Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac
OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
rep=request.urlopen(a)
rep.read()
 
POST发送数据,POST发送的数据也需要经过编码。
实例:
import urllib.parse
from urllib import request
#url使用的在抓包工具中的url
url='http://**.**.com/login/'
request = request.Request(url)
#header头可以通过add_header设置也可以在requests.Request实例化对象时加入
request.add_header(
'User‐agent','Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.
0.11' )
data = {'username':'melon','password':'passwd','authcode':'1234'}
encoded_data = urllib.parse.urlencode(data)
request.add_data(encoded_data)
req = request.Request(url, encoded_data)
------------------urllib中对一般反爬虫的解决方法------------------
 
对于反爬虫一般的处理是在headrs(请求头)中设置User-Agent(标识符),cookie(临时身份
证),Referer(来者)。还有一些是验证ip地址,判断服务次数,我们可以通过代理ip设置。
 
在实例化对象时加入是以字典的方式加入,在实例化后加入是以()的方式加入
 
urllib中的User-Agent(标识符)设置
request = requests.Request(url)
request.add_header(
'User‐agent','Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.
0.11')
rep=request.urlopen(request)
rep.read()
#user‐agent可以通过add_header设置,也可以在requests.Request实例化对象时加入
head={
'User‐agent':'Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0. 0.11'
 }
a= request.Request(url,headers = header)
rep=request.urlopen(a)
rep.read()
urllib中的Referer(来者)设置
request= requests.Request(url)
request.add_header('Referer', 'http://www.xxx.com/')
rep=request.urlopen(request)
rep.read()
#referer可以通过add_header设置,也可以在requests.Request实例化对象时加入
head={'Referer': 'http://www.xxx.com/'}
a= request.Request(url,headers = header)
rep=request.urlopen(a)
rep.read()
urllib中的cookie(临时身份证)设置
方式一:被动添加cookie在headers头中,同前面的实例化对象后添加user-agent和referer一 样以下是模拟登陆后的博客园的页面(被动方式)
 
实例:
url='https://www.cnblogs.com/lcyzblog/'
from urllib import request
req=request.Request(url)
req.add_header('cookie','_ga=GA1.2.439597965.1564067765; ....关键参数忽略')
rep=request.urlopen(req)
rep.read().decode('utf‐8')
#cookie头可以通过add_header设置,也可以在requests.Request实例化对象时加入
head={
'cookie': '_ga=GA1.2.439597965.1564067765; ....关键参数忽略' 
} 
a= request.Request(url,headers = header)
rep=request.urlopen(a)
rep.read().decode('utf‐8')
方式二:使用http.cookiejar模块,可以主动的去登陆获取cookie
HTTP.COOKIEJAR模块下的类说明
CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加 cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢 失。
 
FileCookieJar (filename,delayload=None,policy=None):从CookieJar派生而来,用来创 建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的 文件名。 delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数 据。
 
MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来, 创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
 
LWPCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创 建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例 get后得到cookie
 
get方式一般不会拿来登陆,这里也只是提供思路
from http.cookiejar import CookieJar
url = 'http://www.baidu.com/' 
headers = {
'User‐Agent': 'Mozilla/5.0(Windows NT 10.0; WOW64)AppleWebKit/537.36 (KHTM L, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3427.400 QQBrowser/ 9.6.12513.400'
} 
cookie = CookieJar()

from urllib import request
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
resp = opener.open(url)
cookie
<CookieJar[Cookie(version=0, name='BAIDUID', value='...忽略

  

post网站获取cookie思路 ~_~因为这里没有找到没有验证码登陆的网站,所以只提供思路 。
post思路和get的方式差不多,只不过是在opener.open打开时是打开的一个被 request.Request的对象,在对象中已经添加好了发送的数据
实例:
from urllib import request
import urllib.parse
from http.cookiejar import CookieJar
url='http://www.xxx.com'
headers = {
User‐Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
data = {'username': 'xxxxxxxxx', 'password': 'xxxxxxx'} 
data = urllib.parse.urlencode(data).encode('utf‐8')
cookie=CookieJar()
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
req = request.Request(url, data)
resp = opener.open(req)
总结方式:
第一步导入对应的包和模块
第二步设置url和一些反反爬虫的参数如headers中的user-agent...在get获取cookie时不需要
实例化在post时需要先实例化并传入post发送的data(数据)
第三步使用CookieJar实例化一个对象,步骤中我们称为cookie对象。接着再使用request下的
HTTPCookieProcessor(cookie对象)丢入在生成构建一个对象,称为handler对象。在使用
request下的build_opener(handler对象)丢入生成一个获取返回信息的对象,称为opener
对象,在post时要先用request. Request方式生成一个带有发送数据的对象,get时直接传入
url。
最后一步,用opener对象的open方式丢入request.Request生成的对象或者一个普通的url。 此时再去访问cookie这个对象就可以获得服务器返回的cookie数据
 
 
ip代理设置方式
首先需要获取ip代理,我们可以在百度搜索免费ip代理作为测试,在实际工作中建议购买稳定 的ip代理。
代理分成两部分。第一个叫协议,第二个为ip地址和端口号,在python中以字典的 形式传入
from urllib import request
url = "http://www.baidu.com"
proxy = {'HTTPS': '218.91.112.139:9999'}
proxy_handler = request.ProxyHandler(proxy)
opener = request.build_opener(proxy_handler)
req=request.Request(url)
response=opener.open(req)
response.getcode()
200

  

 
 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/lcyzblog/p/11266640.html