爬虫初识

两个常用库

确定自己要访问的页面和构建请求头:
url="http://www.xxx.com"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"}
query_string = form_data = {} 两者都是 字典类型(json)

1. urllib

urllib.requst 用于发送请求
    1. 构建请求对象 my_request = urllib.requst.Request(url=url, headers=headers)
    2. 获取响应: response = urllib.request.urlopen(url=url)
urllib.parse 用于解析请求数据
    1. 当用户使用get方式请求数据:
       new_url= url + "?" + urllib.parse.urlencode(data=data) 传入一个 字典类型数据,将数据拼接在url末尾
    2. 当用户使用post 方式请求数据:
       new_data = urllib.parse.urlencode(data=data)
       resp = urllib.request.urlopen(url, data) 通过 urlopen 方法中的data参数来达到使用post 方式访问
           

2. requests

1. 通过不同的方法进行不同类型的请求:
GET方式:  requests.get(url, headers, params)
POST方式: requests.post(url, headers, params)   
此外还有 PUT / DELETE / OPTION / HEAD 等多种请求方式
2. 获取响应
response.text        # 以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。 
response.content     # 以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。
response.json()      # Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常

三种数据提取方式

正则

正则表达式:匹配一类具有相同规则的字符串 (想获取那个,那个加括号就可以了)
匹配规则: import re      
单字符:  . 除换行以外的所有字符 (使用re.S 可以是 . 匹配换行符)
          [] 其中包含的任意字符
          \d  所有数字 [0-9]   # \D  非数字 
          \w  数字、字母、下划线、中文(不匹配换行符)   # \W   非\w 
          \s  所有空白字符    # \S  非空白字符 
数量修饰:  *  任意多次  >= 0
            +  至少1 次  >= 1
            ? 可有可无  0 或者 1 次
            {m, n}  m 到 n 次
边界:    ^  以 XXX 开头
          $  以 xxx 结尾
分组: () 视为一个整体, {“(ab){3}”:"对ab 判定3次"}
        (?<name>\d)  使用<..> 来为后面的匹配规则起别名
非贪婪:  .*?  和  .+?  
re.I:  不区分大小写   re.M 多行模式   re.S: 单行模式,改变 '.' 的行为       re.X:详细模式
match \ search \  findall
re.sub(正则表达式, 替换内容, 匹配内容)

bs4

beautifulSoup 4 
# 设置为国内源   
    1. 进入 C盘 C:/USERS/XXX/  文件夹
        或者:文件夹导航栏输入 %appdata%   进入 C 盘 roaming文件夹
    2. 新建文件夹 pip, 创建一个 pip.ini 文件
    3. 输入
        [global]
        timeout = 6000
        index-url = https://pypi.tuna.tsinghua.edu.cn/simple
        truste-host = pypi.tuna.tsinghua.edu.cn
# 简单使用:选择器/jquery
    from bs4 import BeautifulSoup 
    # 可以将 html 文件转换成指定的对象,然后通过对象的属性和方法来查找指定内容
    1. 转化本地文件
    soup = BeautifulSoup(open('本地文件'), 'lxml')
    2. 转化网络文件
    soup = BeautifulSoup("字符串类型或字节类型", "lxml")
# soup 对象的属性
    1.soup.a 返回查询到的第一个a 标签, 也可以 soup.div, soup.img等
      soup.a.attrs: 使用字典形式返回 a 标签的所有属性
            print(soup.a.attrs) >>> {'href':'http://www.xx.com', 'title':'title', 'target':'target', 'alt':'alt'}
      soup.a['href'] == soup.a.attrs['href']  >>> 'http://www.xx.com'
      soup.a['title'] == soup.a.attrs['title'] >>> 'title'
    2. soup.div.string 
       soup.div.text
       soup.div.get_text() 
        # 如果 a 标签内部还有其他标签时, a.string 的返回值为 None, text和get_text()方法提取纯文本,并且获取换行
    3. find 方法    soup.find(标签名, 限定条件)
        # 如果是 class 属性的时候 使用 class_  加下划线
       print(soup.find(a, href="www.xx.com"))
       print(soup.find(a, title="xxx"))
       print(soup.find(a, class_ = "xxx")) 
       找到第一个符合条件的标签,不仅soup 对象可以使用,普通的div对象也可以使用,查找制定 div内部的标签
       获取标签后使用上述的方法:attrs 来获取属性
    4. find_all()   返回一个列表,里面是所有符合方法的对象
       find_all("a")
       find_all("a", class_ ="xxx")
       find_all("a", re.compile(r"xxx"))
       find_all("a", limit=2)    # 限定取 前两条
       find_all(["a", "b", "i"])   # 可以传入一个裂变,返回所有符合要求的标签
    5. select 使用css 中的选择器
        # 常见选择器: 标签/类/id/组合/层级/伪类/属性选择起
        a
        .dudu
        #lala
        a, .dudu, #lala .meme
        div .dudu #lala .meme     只要是子级 就可以查找,孙子类
        div > p > a > .dudu   # 只能是下一级
        返回值 还是一个列表,只有一个返回值对象也是列表包裹
        支持子对象调用select方法,那么就是从这个子对象里面去找符合这个选择器的标签

xpath

用来在 XML 文档中查找信息,通过XML 文档中的元素和属性进行导航。 HTML 可以归结为 XML 的子类,通过路径选择内容
七种节点: 元素(div/a/p),属性(href/title),文本,命名空间,处理指令,注释,文档节点(根节点)
常用的路径表达式:
// : 不考虑位置的查找
./ : 从当前节点开始往下找
@ : 选取属性
实例:
/body/div  : 选取 body 下的所有 div 元素,不包含div 内部的div元素(不包含孙子元素)
//div : 查找所有的div 元素
/body//div : 选取body 内的所有 div 元素,包含孙子节点
/body/div[1] :body中的 第一个 div 元素
/body/div[last()] : body 中的 最后一个 div 元素
//div[@class] : 选取所有拥有 class 属性的div 元素
//div[@class="xx"] : 选取所有 class 属性值为 xx 的 div 元素
/body/div[@id="x"]/a : 选取 id 属性为 x 的div 元素下面的 所有 a 标签
定位方式:
1. 属性定位  //div/a[@id='xxx']
2. 层级定位  //div/div/div[@id='xx']/a
3. 索引定位  //div/div/div[1]//a
    # 索引从 1 开始,  // a 表示所有的 a 节点,不管位置
4. 逻辑运算  //input[@class="xxx" and name="xxx"]
5. 模糊匹配  contains:  // input[contains(@class, "xx")]  # 所有由 class 属性的 input, 并且class 属性中包含 xx
    starts-with:  //input[starts-with(@class, "xx")]  # 所有有 class 属性的 input,并且class属性以 xx 开头
6. 取文本  //div[@id='u1']/a[contains(@href, "tieba")]/text()
            //div//text()   # 获取div 下的所有文本内容
7. 取属性  //div/a[3]/@href
使用方式: from lxml import etree
    将html 文档变成一个对象,然后调用对象的属性和方法
    1. 本地文件 : tree = etree.parse("文件名")
    2. 网络文件 : hteml_tree = etree.HTML("网络字符串") 
# 不论有多少返回值,xpath 都返回一个 列表

猜你喜欢

转载自www.cnblogs.com/hwtky/p/12347635.html