python爬虫 Day 9

XPath 案例补充+Beauitful Soup入门

XPath 案例补充

1. index 的使用

from lxml import etree
import csv

html = """

    
        测试 
    
    
         
  • first item
  • second item
  • third item
  • fourth item
  • fifth item
  • sixth item
  • eighth item
  • """ tree = etree.HTML(html) # [m:n] 左闭右开 texts = tree.xpath('//li/text()')[:3] cs = tree.xpath('//li/@class')[:3] # print(texts) # ['first item', 'second item', 'third item'] # print(cs) # ['item-0', 'item-1', 'item-inactive'] # 定义一个列表 用来存放所有数据 lst_data = [] for c in cs: # 定义一个字典 用来存放一条数据 d ={} # print(c) lst_index = cs.index(c) # 获得c所对应的索引 # print(lst_index) # print(texts[lst_index]) # cs中c所对应的texts值 d['class'] = c d['text'] = texts[lst_index] # print(d) lst_data.append(d) print(lst_data) # [{'class': 'item-0', 'text': 'first item'}, {'class': 'item-1', 'text': 'second item'}, {'class': 'item-inactive', 'text': 'third item'}] # 保存数据 header = ['class', 'text'] with open('data.csv', 'w', encoding='utf-8', newline='') as f: w = csv.DictWriter(f, header) w.writeheader() w.writerows(lst_data)

    2. 豆瓣 TOP250 爬取
    (1)目标:练习XPath的使用
    (2)步骤:a. 发送请求 获取响应 得到html文件 --> b. 解析数据 获得所需数据 存放字典列表z中 --> c. 保存数据于csv文件中
    (3)需要用到的工具:requests lxml csv
    (4)进行翻页处理( ?)

    import requests
    from lxml import etree
    import csv
    
    
    # 发请求 获相应
    # url就是发起请求的目标url
    def get_source(url):
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        }
        res = requests.get(url, headers=headers)
        html = res.content.decode('utf-8')
        # print(html)
        return html
    
    
    # 解析数据
    def parsed_source(html):
        # 将网页源码加载成一个element对象
        tree = etree.HTML(html)
        # text() 获取文本数据
        # title = tree.xpath('//div[@class="info"]/div[@class="hd"]/a/span/text()')
        # print(title)
        divs = tree.xpath('//div[@class="info"]')
        # print(len(divs))
        # 用来存放所有数据的大列表
        lst_data = []
        for div in divs:
            # 用来存储一条数据的字典
            d = {}
            # print(div)
            # 列表的下标索引值是从0开始的
            # strip()用来处理字符串里面头和尾的空白字符
            title = div.xpath('./div[@class="hd"]/a/span/text()')[0].strip()
            score = div.xpath('./div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0].strip()
            # span[last()] 获取最后一个span标签
            com_num = div.xpath('./div[@class="bd"]/div[@class="star"]/span[last()]/text()')[0].strip()
            quote = div.xpath('./div[@class="bd"]//span[@class="inq"]/text()')[0].strip()
            link_url = div.xpath('./div[@class="hd"]/a/@href')[0]
            d['title'] = title
            d['score'] = score
            d['com_num'] = com_num
            d['quote'] = quote
            d['link_url'] = link_url
            # print(title, score, com_num, quote, link_url)
            # 把存放一条数据的字典插入列表
            lst_data.append(d)
        # print(lst_data)
        return lst_data
    
    
    # 保存数据
    def save_data(lst_data, header):
        # w-->写 从头开始写  a-->追加
        with open('movie_data.csv', 'a', encoding='utf-8', newline='') as f:
            w = csv.DictWriter(f, header)
            # 写入表头
            w.writeheader()
            # writerows 一次性写入多行数据
            w.writerows(lst_data)
    
    # 主函数 调用函数
    def main():
        url = 'https://movie.douban.com/top250?start=0'
        h = get_source(url)
        header = ['title', 'score', 'com_num', 'quote', 'link_url']
        movie_data = parsed_source(h)
        save_data(movie_data, header)
    
    if __name__ == '__main__':
        main()

    Beautiful Soup入门

    基础知识

    1. 定义:Beautiful Soup 是一个可以从HTML或XML文件中提取数据的网页信息提取库
    2. 作用:用来解析和提取数据的
    3. 对比不同数据解析方式
      (1)正则表达式 复杂
      (2)XPath 语法 例如/ //等
      (3)bs4 方法 例如find() fing_all()

    bs4源码分析

    1. structure页面 导航页面 展示架构
    2. 图标
      (1)c class 类
      (2)m method 方法
      (3)f field 字段
      (4)p property 装饰器
      (5)v variable 变量

      python爬虫 Day 9_第1张图片

    你可能感兴趣的:(爬虫)