urllib库

一,爬虫的基本流程

1:向服务器发起请求

通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器的响应。

2:获取响应内容

如果服务器正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能有HTML、JSON、二进制文件(如图片、视频等类型)。

3:解析内容

得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是JSON,可以直接转成JOSN对象进行解析,可能是二进制数据,可以保存或者进一步处理

4:保存内容

保存形式多样,可以保存成文本,也可以保存至数据库,或者保存成特定格式的文件。

二,urllib库
1.它其中包含的几个模块的说明:

1:请求模块,urllib.request
2:异常处理模块,urllib.error
3:url解析模块,urllib.parse
4:robots.txt解析模块 urllib.robotparser

urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。

2.基础用法
#get方式不带参数请求网页
import urllib2  
request = urllib.Request('http://www.baidu.com')
#通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器的响应。
response = urllib2.request.urlopen(request)  
#如果服务器正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能有HTML、JSON、二进制文件(如图片、视频等类型)  
print(response.read().decode('utf-8'))
#read()方法把返回的数据读取出来。decode方法把对获取到的网页用utf-8解码

------------------------------------------------------------------------------------

#带参数 POST 请求
#获取一个post对象:模拟用户真实登录时使用
import urllib.parse # 解析器
data=bytes(urllib.parse.urlencode({"word":"hello"}),encoding="utf8")
#byte()方法:把里面的信息都转换为二进制
#用parse把字典用utf-8的形式解析一遍,然后封装成一个byte数组,给data
response=urllib.request.urlopen("http://httpbin.org/post",data=data)
print(response.read())

-----------------------------------------------------------------------------

#超时设置
response=urllib.request.urlopen("http://httpbin.org/get",timeout=1)
try:
    response = urllib.request.urlopen("http://httpbin.org/get",timeout=0.01)
    # 可以设置timeout时间,即过了这个时间还没有返回数据,则报错
    print(response.read().decode("utf-8"))
except urllib.error.URLError as e:
    print(e)

try:
    response=urllib.request.urlopen("http://httpbin.org/get",timeout=0.1)
except urllib.error.URLError as e:
    if isinstance(e.reason,socket.timeout):
        print("TIME OUT!")

-------------------------------------------------------------------------------

#状态,响应等
print(response.status_code)#响应状态信息
print(response.status)#如果是200则表示正常的响应,被接收到了,并且正常返回了
print(response.getheaders())# getheaders()方法:获取头部信息
print(response.getheader("Server"))#getheader("...")表示得到括号内的内容,即得到头部中Server的内容
print(type(response))  #返回的响应类型
the_page = response.read()  
print the_page

-------------------------------------------------------------------------------------------------------

#插入数据发送
import urllib
import urllib2

url = 'http://www.someserver.com/register.cgi'

values = {'name' : 'WHY',
          'location' : 'SDU',
          'language' : 'Python' }
data = urllib.urlencode(values)  #编码工作
request = urllib2.request(url, data)  #发送请求的时候,同时发送数据data
response = urllib2.urlopen(request)   #接受反馈信息

----------------------------------------------------------------------------------------------------

#伪装成浏览器
import urllib  
url = 'http://www.someserver.com/cgi-bin/register.cgi' 
ua = UserAgent()

dic={
    "name":"Germey",
    'location' : 'SDU'
}
data=bytes(urllib.parse.urlencode(dic),encoding="utf8")

headers={
    "User-Agent":ua.random,
    "Host":"httpbin.org"
}
request=urllib.request.Request(url=url,data=data,headers=headers,method="POST")
#request是封装好的一个对象
response=urllib.request.urlopen(req)
print(response.read().decode("utf-8"))
3.设置代理
import urllib.request

#设置代理
proxy_handler=urllib.request.ProxyHandler(
    {
        'http':"http://121.232.146.98:9000",
    }
)
opener=urllib.request.build_opener(proxy_handler)
response=opener.open("http://www.baidu.com")
print(response.read())
4.URL解析相关
①.urlparse :url解析库
from urllib.parse import urlparse
result=urlparse("http://www.baidu.com/index.html;user?id=5#comment")
#urlparse将url内容解析返回给result
print(type(result),result)
#结果为:<class 'urllib.parse.ParseResult'>
print(result)
#结果:ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')

#没有协议类型,可指定协议类型
result=urlparse("www.baidu.com/index.html;user?id=5#comment",scheme="https")
print(result)

#如果url中有协议类型,指定协议类型失效
result=urlparse("http://www.baidu.com/index.html;user?id=5#comment",scheme="https")
print(result)
#结果scheme还是为http
②urlunparse :url拼接库
from urllib.parse import urlunparse
data=['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data))
#结果:http://www.baidu.com/index.html;user?a=6#comment
③urlencode:把一个字典转化成get请求参数
from urllib.parse import urlencode
params={
    "name":"germey",
    "age":22
}
base_url="http://www.baidu.com?"
url=base_url+urlencode(params)
print(url)
#结果:http://www.baidu.com?name=germey&age=22
5,处理cookies
①cookies简介

Cookies是数据包,可以让网页具有记忆功能,在某台电脑上记忆一定的信息

Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。

当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等

Cookies的工作原理:第一次由服务器端写入到客户端的系统中。以后每次访问这个网页,都是先由客户端将Cookies发送到服务器端,再由服务器端进行判断,然后再产生HTML代码返回给客户端。通过这个原理服务器就可以根据不同用户产生不同cookies文件,这样当该用户再次访问同一个站点时就可以根据不同的cookies文件返回不同的页面信息了。

cookie具有的属性:

  • name:为一个cookie的名称。
  • value:为一个cookie的值。
  • domain:为可以访问此cookie的域名,譬如www.baidu.com:baidu.com就是顶级域名

域名的划分:http://aaa.bbb.secode.first.com,每一个点划分为一个域名,域名从后向前一次为顶级、一级、二级等。

②获取cookies

第一种:cookie放在headers中

import urllib.request
url = "http://www.baidu.com"
headers = {"User_Agent":"自己的user-agent",
    "Cookie" : "。。。。。。这里就是。。。。"
}
response = requests.get(url, headers = headers )
with open("csdn.html", "w", encoding="utf-8") as f:
    f.write(response.content.decode())
#将这个页面的数据返回到了csdn.html这个文件里面

第二种:cookie字典传给cookies参数

import requests

url = "http://www.renren.com/967272361/profile"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
}
# 不带上Cookie就访问不了这个页面
cookie = "anonymid=jk63khrk-y97r4p; _r01_=1; ln_uact=mr_mao_hacker@163.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn421/20180720/1740/main_JAWQ_0aa000000ceb195a.jpg; _ga=GA1.2.273332130.1532825428; depovince=HUN; JSESSIONID=abcE5k0CiAJDc9ESVEcuw; ick_login=026ba348-e4e9-4871-9ce3-5868b95cfdd3"
# 将上面哪个cookie转化成字典类型
cookie_dict = {i.split("=")[0]:i.split("=")[-1] for i in cookie.split("; ")}
#split表示切分
response = requests.get(url, headers = headers, cookies = cookie_dict)

with open("renren2.html", "w", encoding="utf-8") as f:
    f.write(response.content.decode())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值