zoukankan      html  css  js  c++  java
  • 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'))
  • 相关阅读:
    TensorFlow-Slim 简介+Demo
    AI 常见术语总结
    经典深度学习CNN总结
    YOLO V3 原理
    tf.app.run() 运行结束时,报错:SystemExit exception: no description
    VSCode中相对路径设置问题
    SSD算法原理
    机器学习-交叉熵原理
    tensorflow scope的作用
    水池进水和出水两个线程问题
  • 原文地址:https://www.cnblogs.com/Augustusben/p/12792887.html
Copyright © 2011-2022 走看看