Python爬虫学习:一些库

urllib库

urlopen函数:

Python3urllib库中,所有和网络请求相关的方法,都被集到urllib.request模块下面了,以先来看下urlopen函数基本的使用:

from urllib import request
resp = request.urlopen('http://www.baidu.com')
print(resp.read())

 

实际上,使用浏览器访问百度,右键查看源代码。你会发现,跟我们刚才打印出来的数据是一模一样的。也就是说,上面的三行代码就已经帮我们把百度的首页的全部代码爬下来了。一个基本的url请求对应的python代码真的非常简单。
以下对urlopen函数的进行详细讲解:

  1. url:请求的url。
  2. data:请求的data,如果设置了这个值,那么将变成post请求。
  3. 返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)readlinereadlines以及getcode等方法。

urlretrieve函数:

这个函数可以方便的将网页上的一个文件保存到本地。以下代码可以非常方便的将百度的首页下载到本地:

from urllib import request
request.urlretrieve('http://www.baidu.com/','baidu.html')

 

urlencode函数:

用浏览器发送请求的时候,如果url中包含了中文或者其他特殊字符,那么浏览器会自动的给我们进行编码。而如果使用代码发送请求,那么就必须手动的进行编码,这时候就应该使用urlencode函数来实现。urlencode可以把字典数据转换为URL编码的数据。示例代码如下:

1 from urllib import parse
2 data = {'name':'爬虫基础','greet':'hello world','age':100}
3 qs = parse.urlencode(data)
4 print(qs)

 

parse_qs函数:

可以将经过编码后的url参数进行解码。示例代码如下:

1 from urllib import parse
2 qs = "name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=100"
3 print(parse.parse_qs(qs))

 

urlparse和urlsplit:

有时候拿到一个url,想要对这个url中的各个组成部分进行分割,那么这时候就可以使用urlparse或者是urlsplit来进行分割。示例代码如下:

 1 from urllib import request,parse
 2 
 3 url = 'http://www.baidu.com/s?username=zhiliao'
 4 
 5 result = parse.urlsplit(url)
 6 # result = parse.urlparse(url)
 7 
 8 print('scheme:',result.scheme)
 9 print('netloc:',result.netloc)
10 print('path:',result.path)
11 print('query:',result.query)

 

urlparseurlsplit基本上是一模一样的。唯一不一样的地方是,urlparse里面多了一个params属性,而urlsplit没有这个params属性。比如有一个url为:url = 'http://www.baidu.com/s;hello?wd=python&username=abc#1'
那么urlparse可以获取到hello,而urlsplit不可以获取到。url中的params也用得比较少。

request.Request类:

如果想要在请求的时候增加一些请求头,那么就必须使用request.Request类来实现。比如要增加一个User-Agent,示例代码如下:

1 from urllib import request
2 
3 headers = {
4 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
5 }
6 req = request.Request("http://www.baidu.com/",headers=headers)
7 resp = request.urlopen(req)
8 print(resp.read())

 requests库

发送GET请求:

  1. 最简单的发送get请求就是通过requests.get来调用:

    response = requests.get("http://www.baidu.com/")

     

  2. 添加headers和查询参数:

     import requests
     3  kw = {'wd':'中国'}
     4 
     5  headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
     6 
     7  # params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
     8  response = requests.get("http://www.baidu.com/s", params = kw, headers = headers)
     9 
    10  # 查看响应内容,response.text 返回的是Unicode格式的数据
    11  print(response.text)
    12 
    13  # 查看响应内容,response.content返回的字节流数据
    14  print(response.content)
    15 
    16  # 查看完整url地址
    17  print(response.url)
    18 
    19  # 查看响应头部字符编码
    20  print(response.encoding)
    21 
    22  # 查看响应码
    23  print(response.status_code)

     

发送POST请求:

  1. 最基本的POST请求可以使用post方法:

    response = requests.post("http://www.baidu.com/",data=data)

     

  2. 传入data数据:

     1 import requests
     2 
     3  url = "https://www.lagou.com/jobs/positionAjax.json?city=%E6%B7%B1%E5%9C%B3&needAddtionalResult=false&isSchoolJob=0"
     4 
     5  headers = {
     6      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
     7      'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
     8  }
     9 
    10  data = {
    11      'first': 'true',
    12      'pn': 1,
    13      'kd': 'python'
    14  }
    15 
    16  resp = requests.post(url,headers=headers,data=data)
    17  # 如果是json数据,直接可以调用json方法
    18  print(resp.json())

     

使用代理:

使用requests添加代理也非常简单,只要在请求的方法中(比如get或者post)传递proxies参数就可以了。示例代码如下:

 1 import requests
 2 
 3 url = "http://httpbin.org/get"
 4 
 5 headers = {
 6     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
 7 }
 8 
 9 proxy = {
10     'http': '171.14.209.180:27829'
11 }
12 
13 resp = requests.get(url,headers=headers,proxies=proxy)
14 with open('xx.html','w',encoding='utf-8') as fp:
15     fp.write(resp.text)

 

cookie:

如果在一个响应中包含了cookie,那么可以利用cookies属性拿到这个返回的cookie值:

import requests

url = "http://www.renren.com/PLogin.do"
data = {"email":"970138074@qq.com",'password':"pythonspider"}
resp = requests.get('http://www.baidu.com/')
print(resp.cookies)
print(resp.cookies.get_dict())

 

session:

之前使用urllib库,是可以使用opener发送多个请求,多个请求之间是可以共享cookie的。那么如果使用requests,也要达到共享cookie的目的,那么可以使用requests库给我们提供的session对象。注意,这里的session不是web开发中的那个session,这个地方只是一个会话的对象而已。还是以登录人人网为例,使用requests来实现。示例代码如下:

 1 import requests
 2 
 3 url = "http://www.renren.com/PLogin.do"
 4 data = {"email":"970138074@qq.com",'password':"pythonspider"}
 5 headers = {
 6     'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
 7 }
 8 
 9 # 登录
10 session = requests.session()
11 session.post(url,data=data,headers=headers)
12 
13 # 访问大鹏个人中心
14 resp = session.get('http://www.renren.com/880151247/profile')
15 
16 print(resp.text)

 

处理不信任的SSL证书:

对于那些已经被信任的SSL整数的网站,比如https://www.baidu.com/,那么使用requests直接就可以正常的返回响应。示例代码如下:

1 resp = requests.get('http://www.12306.cn/mormhweb/',verify=False)
2 print(resp.content.decode('utf-8'))

 

posted @ 2020-04-28 11:24  Augustusben  阅读(162)  评论(0编辑  收藏  举报