• 爬虫 1


    1.爬虫的介绍
    
    
    ​    
    爬虫的比喻:
    
    ​        互联网就像一张蜘蛛网,爬虫相当于蜘蛛,数据相当于猎物
    
    ​    爬虫的具体定义:
    
    ​        模拟浏览器向后端发送请求,获取数据,解析并且获得我想要的数据,然后存储
    
    ​    爬虫的价值:
    
    ​        数据的价值
    
    
    流程:发送请求--获得数据--解析数据--存储数据
    
    常用的解析模块:bs4,pyquery,re
    2.html协议里需要关注的
    
    请求:
    
    ​    URL:指明了我要去哪里
    
    ​    method:
    
    ​        GET:
    
    ​            传递数据:?&拼在url后面
    
    ​        post:
    
    ​            请求体:
    
    ​                formdata
    
    ​                files
    
    ​                json
    
    ​    请求头:
    
    ​        Cookie:
    
    ​        Referer:告诉服务器你从哪里来
    
    ​        User-Agent:告诉服务器你的身份
    
    
    
    响应:
    
    ​    **Status Code**:
    
    ​        2xx:成功
    
    ​        3xx:重定向
    
    ​    响应头:
    
    ​        **location**:跳转地址
    
    ​        set_cookie:设置cookie
    
    ​    响应体:
    
    ​        1.html代码
    
    ​        2.二进制:图片,视频,音乐
    
    ​        3.json格式
    3、 常用请求库、解析库、数据库的用法
    
    3.1 常用请求库    测试网站:http://httpbin.org/
    
    需要注意,get请求时,路径为 http://httpbin.org/get
    post请求时,路径为http://httpbin.org/post
    因为这两种不同的url后的参数对相对应的请求的数据做了处理
    
    安装 request库  : pip install requests
    
    
    3.2请求:
    
    3.2.1 get请求:
    
        响应对象 = requests.get(......)
    
    **参数:**
    
    url:            
    
    headers = {}       优先级高于cookie
    
    cookies = {}   
    
    params = {}        url里也可以自带参数
    
    proxies = {'http':‘http://端口:ip’}  # 代理ip
    
    timeout = 0.5    # 超时时间
    
    allow_redirects = False   # 允许重定向与否
    
    
    
    3.2.2 post请求   
    
        
    响应对象 = requests.post(......)
    
    **参数:**  与get请求类似
    
    url:
    
    headers = {}    
    
    cookies = {}    用来去验证
    
    data = {}    
    
    json = {}
    
    files = {‘file’:open(...,‘rb’)}
    
    timeout = 0.5
    
    allow_redirects = False
    3.3 自动保存cookie
    
    3.3.1 生成cookie
    
    session = requests.session()  产生session对象
    第一次发送请求后,将cookie值保存
    
    r = session.get(......)
    r = session.post(......)
    session.get(url=url1)
    session.post(url=url1)
    
    
    
    url2 = 'http://www.lagou.com'
    url3 = 'https://www.taobao.com'
    
    r = session.get(url=url2)
    print(1.1,r.cookies)
    print(1.2,session.cookies)
    
    r = session.get(url=url3)
    print(2.1,r.cookies)
    print(2.2,session.cookies)
    
    
    以下为结果,即r.cookies拿到的是当前网页的cookies,
    session.cookies是session对象里所存在的所有的cookies.
    
    .1 <RequestsCookieJar[<Cookie JSESSIONID=ABAAABAAADEAAFI8681BFC6C41A8E717C15FDB51B6E2CB8 for www.lagou.com/>]>
    1.2 <RequestsCookieJar[<Cookie JSESSIONID=ABAAABAAADEAAFI8681BFC6C41A8E717C15FDB51B6E2CB8 for www.lagou.com/>]>
    2.1 <RequestsCookieJar[<Cookie thw=cn for .taobao.com/>]>
    2.2 <RequestsCookieJar[<Cookie thw=cn for .taobao.com/>, <Cookie JSESSIONID=ABAAABAAADEAAFI8681BFC6C41A8E717C15FDB51B6E2CB8 for www.lagou.com/>]>
    3.3.2 保存cookie
    
    import http.cookiejar as cooklib
    url2 = 'http://www.lagou.com'
    url3 = 'https://www.github.com'
    
    session = requests.session()     # RequestsCookieJar  没有save方法
    print(type(session.cookies))   # <class 'requests.cookies.RequestsCookieJar'>
    
    #为了本地保存cookies  需要使用导入的cooklib,产生一个新的对象
    session.cookies = cooklib.LWPCookieJar()    # 这个对象自身有save方法
    print(type(session.cookies))    # <class 'http.cookiejar.LWPCookieJar'>
    
    r = session.get(url=url3)
    session.cookies.save(filename='1.txt')  # 自动将生成的cookies存到  1.txt文件里
    3.3.3 取出cookie
    
    
    import http.cookiejar as cooklib
    url2 = 'http://www.lagou.com'
    session = requests.session()
    session.cookies = cooklib.LWPCookieJar()
    # 将之前保存的cookies取出,加载
    session.cookies.load(filename='1.txt')
    
    session.get(url=url2)
    print(session.cookies)
    # 以下为结果,将已存在的和这次操作的cookies都取出来
    # <LWPCookieJar[
    # <Cookie _octo=GH1.1.1788136135.1565085874 for .github.com/>,
    # <Cookie logged_in=no for .github.com/>,
    # <Cookie has_recent_activity=1 for github.com/>, 
    # <Cookie JSESSIONID=ABAAABAAAIAACBI3C2BB81B972E645113570999880404A8 for www.lagou.com/>
    # ]>
    4. 响应
    
    r.url  
    
    r.text     拿到文本内容加上对应的标签
    
    request.encoding 的默认编码格式是  ISO-8859-1
    r.encoding = 'gbk'  解决乱码的问题方式,将其默认的编码格式改变,针对r.text而言
    查看所爬web的编码格式,在web检查下的控制台输入 document.charset即可!
    
    r.content    二进制文件  可以通过添加decode('') 将其转变成正常的数据
    
    r.json()  记得带括号 拿到json格式的数据
    处理方式一:
    import json
    print(type(r.text))     <class 'str'>
    print(type(json.loads(r.text)))    <class 'dict'>
    处理方式二:
    print(r.json())   直接使用requests内部的json()的方法
    
    需要注意,前端爬过来的数据应该是json格式的字符串,如果是其他的html数据,会报错!!!
    
    r.status_code   状态吗
    
    r.headers    响应头
     
    r.cookies
    
    r.history    # 重定向相关 即拿到 [<Response [301]>]
    5.常用解析语法
    
    ### css选择器
    1、类选择器                 .类名
    
    ​    2、id选择器                #id值
    3、标签选择器         标签名
    
    ​    4、后代选择器      选择器1 选择器2
    
    ​    5、子选择器       选择器1>选择器2
    
    ​    6、属性选择器  
    
                                 [属性]   有这个属性的标签
    
    ​                            [属性=值1]  有这个属性且值=1
    
    ​                            [属性^=值]   以值开头
    
    ​                            [属性$=值]   以值结尾 
    
    ​                            [属性*=值]    包含该值
    
    
    
    ​    7、群组选择器     选择器 1,选择器 2    之间用逗号隔开
    
    ​    8、多条件选择器     选择器1选择器2       即之间不分开
    
    
    xpath选择器
      使用差不多
    6.request-html模块
    
    
    安装 : pip install request-html
    
    
    使用:
    
    from requests_html import HTMLSession
    
    session = HTMLSession()    # 同样是产生一个session对象
    
    
    
    响应对象 = session.request(......,method='')
    
    响应对象 = session.get(......)
    
    响应对象 = session.post(......)
    
    
    
    属性和request模块式一样的
    html对象属性
    
    
    request-html 和 request  的区别在于 前者可以对html页面进行解析
    
    r.html.absolute_links    # 将所爬web里的相对路径变为绝对路径
    同时结果为集合,完成数据的去重,同时拿到绝对路径
    
    .links   输出原样的链接,相对路径还是相对
    
    .base_url   基本链接
    
    .html        html文件
    
    .text     拿到所有的文本内容    很好用
    
    .encoding = 'gbk'    解决r.html.html的编码问题
    
    .raw_html   获得二进制数据流,原生的传输过来的数据,可以通过decode转变
    
    .pq     产生的是pquery对象
    
    
    注:r.encoding() 控制的是r.text的编码
  • 相关阅读:
    View注入框架:Butterknife简单使用
    Android之——自己定义TextView
    算法练习--小球下落
    【MVC架构】——怎样利用Json在View和Controller之间传递数据
    ZOJ 3494 BCD Code (AC自己主动机 + 数位DP)
    排序算法之归并排序
    C++_关于const 的全面总结
    silent install oracle 11.2.0.1 x86_64 for linux
    struts2请求过程源代码分析
    Hadoop自学笔记(一)常见Hadoop相关项目一览
  • 原文地址:https://www.cnblogs.com/changwenjun-666/p/11311774.html
Copyright © 2020-2023  润新知