欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python 爬虫 day02

程序员文章站 2022-03-02 20:26:37
...

目录:

python 爬虫 day02

解析

数据分类

  1. 结构化数据
    特点 : 有固定的格式 : HTML XML JSON等
  2. 非结构化数据
    示例 : 图片 音频 视频,这类数据一般存储为二进制
    with open(“girl.jpg”,”wb”) as f:
    f.write(html)

正则表达式re

  1. 使用流程
    1. 创建编译对象 : p = re.compile(‘\d’)
    2. 对字符串匹配 : result = p.match(“123ABC”)
    3. 获取匹配结果 : print(result.group())
  2. 常用方法
    1. match(s) : 只匹配字符串开头,返回对象
    2. search(s): 从开始往后去匹配第一个,返回对象
    3. group() : 从match和search返回的对象中取值
    4. findall(s):全部匹配,返回一个列表
  3. 表达式

    符号 作用
    . 任意字符(不能匹配\n)
    […] 包含[]内容 A[BCD]E -> ABE ACE ADE
    \d 数字
    \w 字母 数字 下划线
    \s 空白字符
    \S 非空白字符
    * 前一个字符出现0次或多次
    ? 0次或1次
    + 1次或多次
    {m} 出现m次

    贪婪匹配 : 整个表达式匹配成功前提下,尽可能多的去匹配*
    非贪婪匹配 : 整个表达式匹配成功前提下,尽可能少的去匹配*

  4. 示例 :

    import re
    s = """<div><p>仰天大笑出门去,我辈岂是蓬蒿人</p></div>
    <div><p>天生我材必有用,千金散尽还复来</p></div>"""
    
    # 非贪婪匹配
    
    p = re.compile('<div>.*?</div>',re.S)
    result = p.findall(s)
    print(result) # 列表中2个元素
    
    # 创建编译对象,贪婪匹配
    
    p = re.compile('<div>.*</div>',re.S)
    result = p.findall(s)
    print(result) # 列表中1个元素
  5. findall()的分组

    1. 解释 :先按整体匹配出来,然后再匹配()中内容,如果有2个或者多个(),则以元组方式去显示
    2. 例子:

      import re
       s = "A B C D"
       p1 = re.compile('\w+\s+\w+')
       print(p1.findall(s))
      
       # 1.按整体去匹配 ['A B','C D']
       # 2.显示括号()中内容 ['A','C']
       p2 = re.compile('(\w+)\s+\w+')
       print(p2.findall(s))
      
       # 1.整体匹配 :['A B','C D']
       # 2.显示括号内容 :[('A','B'),('C','D')]
       p3 = re.compile('(\w+)\s(\w+)')
       print(p3.findall(s))

Fiddler抓包工具

  1. 抓包设置
    1. 设置Fiddler抓包工具
      1. HTTPS : Tools -> HTTPS -> …from browsers only
        –> Actions证书信任
      2. connections : 设置端口号 :8888
    2. 设置浏览器代理
      Proxy SwitchOmega - 选项 - 新建情景模式 - HTTP 127.0.0.1 8888 - 应用
  2. Fiddler常用菜单
    1. Inspector : 查看抓到数据包的详细内容
    2. 常用选项
      1. Headers : 客户端发送到服务器的header,包含web客户端信息 cookie 传输状态
      2. WebForm : 显示请求的POST的数据
      3. Raw : 将整个请求显示为纯文本
  3. 请求方式及案例

    1. GET(查询参数都在URL地址中显示)
    2. POST
    3. 特点 : 查询参数在Form表单里保存
    4. 使用
      urllib.request.Request(url,data=data,headers=headers)
      data : 表单数据data必须以 bytes 类型提交,不能是字典
    5. 案例 :有道翻译

      1. 利用Fiddler抓包工具抓取 WebForms 里表单数据
      2. 对POST数据进行处理 bytes 数据类型
      3. 发请求得响应
      4. 例子:

        from urllib import request,parse
        import json
        
        
        # 处理表单数据
        
        
        # Form表单的数据要放到字典中,然后再进行编码转换
        
        word = input("请输入要翻译的内容:")
        data = {"i":word,
                "from":"AUTO",
                "to":"AUTO",
                "smartresult":"dict",
                "client":"fanyideskweb",
                "salt":"1536648321283",
                "sign":"1e7948e25551448dbfb7184f23dc126c",
                "doctype":"json",
                "version":"2.1",
                "keyfrom":"fanyi.web",
                "action":"FY_BY_REALTIME",
                "typoResult":"false"
            }
        
        # 把data转为 bytes 数据类型
        
        
        # decode为字符串,encode为bytes
        
        data = parse.urlencode(data).encode("utf-8")
        
        # 发请求 得响应
        
        
        # 此处URL为抓包工具抓到的 POST的URL
        
        url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
        headers = {"User-Agent":"Mozilla5.0/"}
        req = request.Request(url,data=data,headers=headers)
        res = request.urlopen(req)
        
        # result为json格式的字符串
        
        result = res.read().decode("utf-8")
        
        
        # 把json格式的字符串转换为 Python字典
        
        
        # json模块中的loads方法 :json格式字符串 -> Python字典
        
        result_dict = json.loads(result)
        
        #print(result_dict)
        
        
        #{'type': 'ZH_CN2EN', 
        
        
        # 'errorCode': 0, 
        
        
        # 'elapsedTime': 0, 
        
        
        # 'translateResult': [[{'src': '你好', 'tgt': 'hello'}]]}
        
        r = result_dict["translateResult"][0][0]["tgt"]
        print(r)
    6. json模块
      json.loads("json格式的字符串")
      作用 :把json格式的字符串 -> Python字典
    7. Cookie模拟登陆

      1. Cookie和Session
        cookie :通过在客户端记录的信息确定用户身份
        session :通过在服务器端记录的信息确定用户身份
      2. 案例 :使用cookie模拟登陆人人网

        1. 获取到登陆信息的cookie(登陆1次抓包)
        2. 发请求得响应
        3. 例子:
        from urllib import request
        
        url = "http://www.renren.com/967469305/profile"
        headers = {"Host":"www.renren.com",
        "Connection":"keep-alive",
        "Upgrade-Insecure-Requests":"1",
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "+ \
        "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440."+ \
        "106 Safari/537.36",
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,"+ \
        "image/webp,image/apng,*/*;q=0.8",
        "Referer":"http://www.renren.com/SysHome.do",
        
        #Accept-Encoding: gzip, deflate
        
        "Accept-Language":"zh-CN,zh;q=0.9",
        "Cookie":"anonymid=jlxb586t8i3v0g; depovince=BJ; _r01_=1; "+ \
        "JSESSIONID=abcqRp76SQcK0dfdzQhxw; ick_login=4165cad5-4fdc-4"+ \
        "66c-a7d0-98e014715ff0; first_login_flag=1; ln_uact=13603263409;"+ \
        " ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; login"+ \
        "from=syshome; jebe_key=094486d9-6cd0-442c-a7d4-c9115c822ab7%7C20"+ \
        "12cb2155debcd0710a4bf5a73220e8%7C1536653132046%7C1%7C153665313190"+ \
        "4; wp_fold=0; wp=0; jebecookies=8314ca50-d39d-4df1-b9fa-ea391456cc"+ \
        "38|||||; _de=4DBCFCC17D9E50C8C92BCDC45CC5C3B7; p=356eafd62d5adaeb9"+ \
        "0370c13491ac9055; t=b963e2106aa3249e5289deba7f486e915; societyguest"+ \
        "er=b963e2106aa3249e5289deba7f486e915; id=967469305; xnsid=3850523b"
        }
        req = request.Request(url,headers=headers)
        res = request.urlopen(req)
        html = res.read().decode("utf-8")
        print(html)
        

requests模块

  1. 安装(Conda prompt终端)
    1.(base) > conda install requests
    (base) > pip install requests
  2. 常用方法
    1. get() : 向网站发起请求,并获取响应对象
      1. 用法:response = requests.get(url,headers=headers)
    2. response的属性
      1. response.text :获取响应内容(字符串)
        一般默认返回字符编码:ISO-8859-1
        手动指定 :response.encoding = “utf-8”
      2. response.content : 获取响应内容(bytes)
        1. 应用场景 :爬取图片、音频等非结构化数据
        2. 示例 :爬取百度美女图片
        3. 找URL
      3. response.status_code : 返回服务器响应码