• python爬虫(一)


    爬虫

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

    cookies是什么?

    cookies存储在客户端,被称为浏览器 cookie 或跟踪 cookies,cookies 是一种小型的,经常加密的文本文件,位于浏览器目录中。当用户的浏览器加载特定网站时,Cookies 就会被创建。 网站将信息发送到浏览器,然后创建文本文件。 每次用户回到同一个网站,浏览器就会检索并将这个文件发送到网站的服务器上。网站服务器设置 cookies 以帮助验证用户,如果用户登录到一个安全区域的网站。 登录信息存储在 cookie 中,这样用户就可以进入和离开网站,而无需重复输入相同的身份验证信息。

    session是什么?

    session存储在服务器端,,我们知道,我们用浏览器打开一个网页,用到的是HTTP协议,学过计算机的应该都知道这个协议,它是无状态的,什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。但是这种无状态的的好处是快速。当用户登录后,需要把用户信息保存到session中,便于确保用户操作权限,在其它页面通过检查session是否为null可以知道用户是否登录。

    http定义的与服务器交互的几种方法:
    get 仅仅获取资源的信息,不增加或者修改数据。
    post 一般丢该服务器上的资源,一般我们通过form表单进行提交请求
    put 增加
    delete 删除

    用法如下:

    import requests
    requests.get("http://www.baidu.com")
    requests.post("http://www.jd.com")
    requests.put("http://www.jd.com")
    requests.delete("http://www.jd.com")

    传递参数

    get方式

    params = {'key1': 'hello', 'key2': 'world'}
    url = 'https://www.jd.com'
    r = requests.get(url=url, params=params)  # 使用get方式传递参数
    r.encoding=r.apparent_encoding  # 解决中文乱码问题
    print(r.url)
    
    结果:
    https://www.jd.com/?key1=hello&key2=world
    
    我们也可以直接使用如下格式
    requests.get('https://www.jd.com/?key1=hello&key2=world')

    post方式

    params = {'key1': 'hello', 'key2': 'world'}
    r = requests.post("http://httpbin.org/post", data=params)  # 使用post方式传递参数
    print(r.text)
    
    http://httpbin.org/post是requests提供的官网地址,通过json的方式给大家返回。可以看到我们返回的数据。Post的数据参数是data,都是字典的类型,但是urllib就没法接受字典类型,必须是字符串.
    结果:
    {
      "args": {}, 
      "data": "", 
      "files": {}, 
      "form": {
        "key1": "hello", 
        "key2": "world"
      }, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Connection": "close", 
        "Content-Length": "21", 
        "Content-Type": "application/x-www-form-urlencoded", 
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.18.4"
      }, 
      "json": null, 
      "origin": "1.202.119.5", 
      "url": "http://httpbin.org/post"
    }

    响应http的请求

    url = 'https://www.qiushibaike.com/'
    r = requests.get(url=url)
    print(r.text)
    print(r.encoding) # 查看编码
    
    print(type(r.text))        # <class 'str'>
    print(type(r.content))    # <class 'bytes'>

    Requests中text和content的区别是什么
    r.text返回的是str类型的数据。
    r.content返回的是bytes型也就是二进制的数据。
    也就是说,如果你想取文本,可以通过r.text。
    如果想取图片,文件,则可以通过r.content。

    Request的其他常用方法

    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'}
    r = requests.get('https://www.qiushibaike.com/', headers=header)
    print(r.text)        # 文本
    print(r.request)    # <PreparedRequest [GET]>
    print(r.headers)    # 查看headers里面的信息
    # {'Server': 'openresty', 'Date': 'Wed, 13 Jun 2018 00:45:18 GMT', 'Content-Type': 'text/html; charset=UTF-8', 'Content-Length': '17262', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Set-Cookie': '_xsrf=2|c507eecf|ae629d57d463c6463e2a1cc9f1e08b29|1528850718; Path=/', 'Vary': 'User-Agent, Accept-Encoding', 'Etag': '"6f919c12f4ca4cbd302750607717ef3cfb69888f"'}
    print(r.cookies)             #  cookies的信息
    print(r.cookies['_xsrf'])     #  可以通过字典的方式取值  2|b52260a2|df5eb7b56a7285dd52fce5041c1d83ec|1528850951
    print(r.url)                 #  请求的url是多少  https://www.qiushibaike.com/
    print(r.status_code)         #  http的状态返回码  200

    Request更改请求头信息

    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'}
    r = requests.get('https://www.qiushibaike.com/', headers=header)
    print(r.text)
    print(r.headers)

    既然我们可以对header信息进行更改,那么为了防止反爬虫操作,我们可以通过定义一个list,然后再通过random模块随机取一个header信息进行访问。
    流行浏览器的user-agent参考:https://blog.csdn.net/zhengqijun_/article/details/80207496

    Request的会话对象

    Python2   
    S = requests.Session()
    
    Python3
    s = requests.session()
    
    一次会话的所有信息都保存在s中,只需要对s进行操作就可以了。
    s.get(url)

    Requests通过会话信息来获取cookie信息
    Cookie的五要素:
    Name value domain path expires

    import requests
    
    def save_cookie():
        s = requests.session()
        s.get('https://www.hao123.com/')
        print(s.cookies)
        print(s.cookies.keys())
        print(s.cookies.values())
        for i in s.cookies:
            print(i)
        print(i.name, i.value, i.domain, i.path, i.expires)
    save_cookie()
    
    结果:
    <RequestsCookieJar[<Cookie BAIDUID=3B72F56E3AC1DBE36501A4C8AEE5E1E1:FG=1 for .hao123.com/>, <Cookie __bsi=11962264801410047351_00_51_N_N_117_0303_c02f_Y for .www.hao123.com/>, <Cookie hz=0 for .www.hao123.com/>, <Cookie ft=1 for www.hao123.com/>, <Cookie v_pg=normal for www.hao123.com/>]>
    ['BAIDUID', '__bsi', 'hz', 'ft', 'v_pg']
    ['3B72F56E3AC1DBE36501A4C8AEE5E1E1:FG=1', '11962264801410047351_00_51_N_N_117_0303_c02f_Y', '0', '1', 'normal']
    <Cookie BAIDUID=3B72F56E3AC1DBE36501A4C8AEE5E1E1:FG=1 for .hao123.com/>
    <Cookie __bsi=11962264801410047351_00_51_N_N_117_0303_c02f_Y for .www.hao123.com/>
    <Cookie hz=0 for .www.hao123.com/>
    <Cookie ft=1 for www.hao123.com/>
    <Cookie v_pg=normal for www.hao123.com/>
    v_pg normal www.hao123.com / None

    Cookie的常用属性

    1. Domain 域
    2. Path 路径
    3. Expires 过期时间
    4. name 对应的key值
    5. value key对应的value值
    cookie中的domain代表的是cookie所在的域,默认情况下就是请求的域名,例如请求http://www.server1.com/files/hello, 那么响应中的set-Cookie默认会使用www.server1.com作为cookie的domain,在浏览器中也是按照domain来组织cookie的。 我们可以在响应中设置cookie的domain为其他域,但是浏览器并不会去保存这些domain为其他域的cookie。
    cookie中的path能够进一步的控制cookie的访问,当path=/; 当前域的所有请求都可以访问到这个cookie。 如果path设为其他值,比如path=/test,那么只有/test下面的请求可以访问到这个cookie。

    使用已知cookie信息,如何访问网站

    url = 'http://httpbin.org/cookies'
    r = requests.get(url, cookies={'key1': 'value1', 'key2': 'value2'})
    print(r.text)
    
    结果:
    {
      "cookies": {
        "key1": "value1", 
        "key2": "value2"
      }
    }

    代理访问

    采集时为避免被封IP,经常会使用代理。requests也有相应的proxies属性。例如:西刺代理。

    import requests
    proxies = {
      "http": "http://182.108.5.246:8118",
      # "https": "http://112.117.184.219:9999",
    }
    r1 = requests.get("http://2017.ip138.com/ic.asp", proxies=proxies)
    r2 = requests.get("http://2017.ip138.com/ic.asp")
    print(r1.text)
    print(r2.text)
    [182.108.5.246]
    [106.38.115.34]
    如果代理需要账户和密码,则需这样:
    proxies = {
        "http": "http://user:pass@10.10.1.10:3128/",
    }

    总结

    Requests给你提供的所有接口,在传输数据的时候,都可以以key:value的形式进行传输。
    如果你使用urllib,那么你就没有这么幸运了,很多事情都需要你自己去处理,并不可以直接通过dict的形式进行传输,需要进行转换。

  • 相关阅读:
    windows定时关机命令
    centos 共享文件目录
    Linux 虚拟机的安全加固建议
    使用mondorescue将本机linux centos 7服务器制作成光盘
    CentOS 7 救援模式启用网卡及重新获取IP地址
    CentOS 7修复MBR和GRUB
    使用windows性能计数器监控cpu使用率
    CodeForces-916A-jamie and Alarm Snooze(笨比题目)
    CodeForces-721D-Maxim and Array(优先队列,贪心,分类讨论)
    CodeForces-721C-Journey(DAG, DP)
  • 原文地址:https://www.cnblogs.com/yangjian319/p/9179860.html
Copyright © 2020-2023  润新知