爬虫简介与requests模块

一 爬虫简介

  • 概述

    网络爬虫是一种按照一定规则,通过网页的链接地址来寻找网页的,从网站某一个页面(通常是首页)开始,读取网页的内容,找到网页中的其他链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止

  • 爬虫的价值

    互联网中最有价值的便是数据

  • robots.txt

    如果自己的门户网站中的指定页面中的数据不想让爬虫程序爬取到的话,那么则可以通过编写一个robots.txt的协议文件来约束爬虫程序的数据爬取。robots协议的编写格式可以观察淘宝网的robots(访问www.taobao.com/robots.txt即可)。但是需要注意的是,该协议只是相当于口头的协议,并没有使用相关技术进行强制管制,所以该协议是防君子不防小人。但是我们在学习爬虫阶段编写的爬虫程序可以先忽略robots协议。

  • 爬虫流程

  • 预备知识

    http协议

requests模块

  • Requests是用Python语言基于urllib编写的,采用Apache2 Licensed开源协议的HTTP库,Requests它会比urllib更加方便,可以节约我们大量的工作,一句话,requests是python实现的最简单易用的HTTP库,建议爬虫使用requests库,默认安装python后,使用pip install requests 安装

  • requests模块支持的请求

    import requests
    requests.get("http://httpbin.org/get")
    requests.post("http://httpbin.org/post")
    requests.put("http://httpbin.org/put")
    requests.delete("http://httpbin.org/delete")
    requests.head("http://httpbin.org/get")
    requests.options("http://httpbin.org/get") 

get请求

  • 基本请求

    import requests
    response = requests.get('https://www.baidu.com/')
    with open('baidu.html','wb') as f:
    f.write(response.conten)
  • 含有参数请求

    import requests
    response = requests(url='https://s.taoba.com/search?q='手机')
    response=requests.get('https://s.taobao.com/search',params={"q":"美女"})
    # params 后面的参数是淘宝搜索的参数,

    如果页面不跳转,说明淘宝添加了反爬机制,需要在请求头添加下列参数

  • 含有请求头请求

    import requests
    response = requests.get(url='https://www.baidu.com/s', params={'wd':'夏雨豪'},
    headers={
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
    })
    with open('sousuo.html', 'wb') as f2:
    f2.write(response.content)
    print('写入完毕')
    # User-Agent 在页面中

  • 含有cookis请求

    import uuid
    import requests
    url = 'http://httpbin.org/cookies' # 这是一个开发测试的网址,专门为了测试发送请求的
    cookies = dict(sid=str(uuid.uuid4()))
    res = requests.get(url=url, cookies=cookies)
    print(res.text)

post请求

  • post请求中与get用法一致,特殊的是requests.post()多了一个参数data,用来存储数据的.

    import requests
    response = requests.post('http://httpbin.org/post', params={"a":"10"}, data={'name':'ling'})
    print(response.text)
  • 发送json数据

    import requests
    rest1 = requests.post(url='http://httpbin.org/post',{'name':'ling'}) #没有指定请求头,#默认的请求头:application/x-www-form-urlencoed
    print(rest1.json())
    # 'Content-Type': 'application/x-www-form-urlencoded'
    rest2 = requests.post(url='http://httpbin.org/post',json={'age':"22",}) #默认的请求头:application/json
    print(rest2.json)

    注意: 请求数据的类型conten-type的类型是urlencoded,只有指定类型content-type类型之后才会发生变化,类型的不同则说明了解码的方式不同,

response对象,获取返回信息

  • 常见属性

    import requests
    
    response = requests.get('http://www.baidu.com')
    print(response.status_code) # 打印响应状态码
    print(response.url) # 打印请求url
    print(response.headers) # 打印头信息
    print(response.cookies) # 打印cookie信息
    print(response.text) #以文本形式打印网页源码
    print(response.content) #以字节流形式打印
    print(response.status_code) # HTTP请求的返回状态
    print(response.cookies.get_dict()) # 以字典的形式返回cookies的信息
    print(response.cookies.items()) # 与dict的items方法一样
    print(response.encoding()) # 返回对象的编码方式
    print(response.history()) # 与重定向有关

关于重定向

有时候我们在请求url时,服务器会自动把我们的请求重定向,比如github会把我们的http请求重定向为https请求。我们可以使用r.history来查看重定向:
print(response.history())
我们使用http协议访问,结果在r.url中,打印的却是https协议。那如果我非要服务器使用http协议,也就是禁止服务器自动重定向,使用allow_redirects 参数:
r = requests.get('http://baidu.com', allow_redirects=False)

关于cookies

  • 如果一个响应包含cookies的话,我们可以使用下面方法来得到它们:

    r = requests.get('http://www.baidu.com')
    print(r.cookies)
  • 也可以发送自己的cookie(使用cookies关键字参数)

    cookies = {'cookies_are':'working'}
    r = requests.get('http://www.baidu.com',cookies=cookies)

关于代理

  • 我们也可以在程序中指定代理来进行http或https访问(使用proxies关键字参数),

    proxies = {
    'http': 'http://10.10.1.10:3128",
    "https": "http://10.10.1.10:1080",
    } requests.get("http://baidu.com", proxies=proxies)

关于session

  • 有时候会有这样的情况,我们需要登录某个网站,然后才能请求相关url,这时就可以用到session了,我们可以先使用网站的登录api进行登录,然后得到session,最后就可以用这个session来请求其他url了:

    s=requests.Session()
    login_data={``'form_email'``:``'youremail@example.com'``,``'form_password'``:``'yourpassword'``}
    s.post(``"http://baidu.com/testLogin"``,login_data)
    r = s.get(``'http://baidu.com/notification/'``)
    print r.text

    其中,form_email和form_password是豆瓣登录框的相应元素的name值

实例

  1. 使用requests+re+process来爬取豆瓣,

    import requests
    import re
    import json
    from multiprocessing import Process
    import time def get_page(url):
    """
    发送请求,获取数据
    :param url:
    :return:
    """
    response = requests.get(url)
    return response def parser(res):
    """
    解析数据
    :param res:
    :return:
    """
    reg = re.compile(
    '<div class="item">.*?<a href="(?P<url>.*?)">.*?<span class="title">(?P<title>.*?)'
    '</span>.*?<span class="rating_num".*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)人评价</span>',
    re.S)
    ret_iter = reg.finditer(res.text)
    return ret_iter def store(ret_iter):
    """
    存储数据
    :param ret_iter:
    :return:
    """
    lis = []
    for i in ret_iter:
    dic = {}
    dic['url'] = i.group('url')
    dic['title'] = i.group('title')
    dic['rating_num'] = i.group('rating_num')
    dic['comment_num'] = i.group('comment_num')
    lis.append(dic)
    with open('douban_re.txt', 'a', encoding='utf8') as f:
    for i in lis:
    f.write(json.dumps(i, ensure_ascii=False) + '\n') def spider_movie(url):
    res = get_page(url)
    ret_iter = parser(res)
    store(ret_iter) if __name__ == '__main__':
    start = time.time()
    p_list = []
    for i in range(10):
    url = "https://movie.douban.com/top250?start=%s&filter=" % i * 25
    p = Process(target=spider_movie, args=(url,))
    p.start()
    p_list.append(p)
    for i in p_list:
    i.join()
    print(time.time() - start)
    1. githup页面,模拟登录,爬取登录页面

      import requests
      import re # 第一步: 请求获取token,以便通过post请求校验
      # session=requests.session()
      res = requests.get("https://github.com/login") authenticity_token = re.findall('name="authenticity_token" value="(.*?)"', res.text)[0]
      print(authenticity_token) # 第二步 构建post请求数据 data = {
      "login": "yuanchenqi0316@163.com",
      "password": "yuanchenqi0316",
      "commit": "Sign in",
      "utf8": "✓",
      "authenticity_token": authenticity_token
      } headers = {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" } res = requests.post("https://github.com/session", data=data, headers=headers, cookies=res.cookies.get_dict()) with open("github.html", "wb") as f:
      f.write(res.content)

爬虫简介与requests模块的更多相关文章

  1. 爬虫简介和requests模块

    目录 爬虫介绍 requests模块 requests模块 1.requests模块的基本使用 2.get 请求携带参数,调用params参数,其本质上还是调用urlencode 3.携带header ...

  2. 爬虫简介、requests 基础用法、urlretrieve()

    1. 爬虫简介 2. requests 基础用法 3. urlretrieve() 1. 爬虫简介 爬虫的定义 网络爬虫(又被称为网页蜘蛛.网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程 ...

  3. 爬虫简介与request模块

    一 爬虫简介 概述 近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的利益,而网络爬虫是其中最为常用的一种从网 ...

  4. 爬虫基础之requests模块

    1. 爬虫简介 1.1 概述 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 1.2 爬虫的价值 在互 ...

  5. 1、爬虫简介与request模块

    一 爬虫简介 概述 近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的利益,而网络爬虫是其中最为常用的一种从网 ...

  6. 爬虫开发5.requests模块的cookie和代理操作

    代理和cookie操作 一.基于requests模块的cookie操作 引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests ...

  7. 爬虫开发3.requests模块

    requests模块 - 基于如下5点展开requests模块的学习 什么是requests模块 requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求.功能 ...

  8. python网络爬虫之二requests模块

    requests http请求库 requests是基于python内置的urllib3来编写的,它比urllib更加方便,特别是在添加headers, post请求,以及cookies的设置上,处理 ...

  9. 爬虫中之Requests 模块的进阶

    requests进阶内容 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个 ...

随机推荐

  1. 【CF888G】Xor-MST(生成树 Trie)

    题目链接 大意 给出\(N\)个点的点权,定义两个点之间的边权为这两个点权的异或和,求这\(N\)个点间的最小生成树. 思路 贪心地想,相连的两个点异或和应当尽量的小. 那么应先从高位确定,因为高位的 ...

  2. HMS Core机器学习服务助力Zaful用户便捷购物

    Zaful是近年来发展良好的出海电商平台,主打快时尚.在洞察其用户有购买街头海报.生活中同款衣物的需求后,Zaful联合HMS Core机器学习服务打造拍照购物服务.用户拍照后可在预设的商品图片库中搜 ...

  3. python中生成器的两段代码

    生产者-消费者经典单线程问题 import time def consumer(name):     print("%s 准备吃包子啦!" %name)     while Tru ...

  4. IDA FLIRT使用

    IDA FLIRT/FLAIR   FLIRT是IDA提供的一种函数识别技术,即库文件快速识别与鉴定技术(Fast Library Identification and Recognition Tec ...

  5. 我们一起来学Shell - shell的数组

    文章目录 什么是数组 数组中常用变量 数组的定义 小括号定义数组变量 小括号加键值对定义数组变量 分别定义数组变量 动态地定义数组变量 数组赋值的切片 遍历数组 关联数组 我们一起来学Shell - ...

  6. 容器化 | 在 KubeSphere 中部署 MySQL 集群

    程润科 数据库研发工程师,目前从事 RadonDB MySQL Kubernetes 研发,热衷于研究数据库内核.K8s 相关技术. 张莉梅 高级文档工程师,目前负责数据库产品文档开发.维护和管理工作 ...

  7. python-利用xlrd模块读取excel数据,将excel数据转换成字典格式

    前言 excel测试案例数据 转换成这种格式 实现代码 import os import xlrd excel_path = '..\data\\test_case.xlsx' data_path = ...

  8. react中配置路由

    一个路由就是一个通道,页面之间的跳转其实就是路由的切换,所以每个应用的路由配置是必须的,浅谈react中怎么配置路由 首先你要在src文件夹下新建一个router的文件下,在router文件下新建一个 ...

  9. [旧][Android] ButterKnife 浅析

    备注 原发表于2016.05.08,资料已过时,仅作备份,谨慎参考 前言 自上星期写 Retrofit 写吐之后 ... 我问大队长能不能换个其他什么东西写,大队长就说了个单词 ButterKnife ...

  10. linux系统挂载磁盘

    linux系统挂载磁盘 ## 将硬盘挂载到/mnt/disk1下 # 检查磁盘状态,确认分区 fdisk -l # 格式化磁盘(分区) mkfs.ext4 /dev/sda #根据机器上的命名 以sd ...