美文网首页
python实战计划爬虫作业1_2: 爬取商品信息

python实战计划爬虫作业1_2: 爬取商品信息

作者: 解宇涵 | 来源:发表于2016-07-18 20:35 被阅读0次

    作业要求:解析本地网页信息,收集商品信息

    爬虫作业1_2.png

    我的代码

    # -*- coding:utf-8 -*-
    
    #这次作业完成从商品网页上爬取商品信息,并保存到一个列表中
    #一个商品信息包括:
    #  {图片地址:pic, 价格: price, 商品标题: title, 评分量: review, 评分星级: star}
    
    from bs4 import BeautifulSoup
    
    with open("/Users/xyh/Documents/python/python3/Week1/1_2/index.html") as webSite:
        soup = BeautifulSoup(webSite, 'lxml')
        pics = soup.select('body > div > div > div.col-md-9 > div > div > div > img')
        prices = soup.select('body > div > div > div.col-md-9 > div > div > div > div > h4.pull-right')
        titles = soup.select('body > div > div > div.col-md-9 > div > div > div > div > h4 > a')
        reviews = soup.select('div > div.ratings > p.pull-right')
        stars = soup.select('div > div.ratings > p:nth-of-type(2)')
    
    products = []
    
    for pic, price, title, review, star in zip(pics, prices, titles, reviews, stars):
        data = {
            'pic' : pic.get('src'),
            'price' : price.get_text(),
            'title' : title.get_text(),
            'review' : int(review.get_text().split(' ')[0]), #只需要reviews的数量,并且以integer格式保存
            'star' : '★' * len(star.find_all('span', class_='glyphicon glyphicon-star')) +
                     '☆' * len(star.find_all('span', class_='glyphicon glyphicon-star-empty'))
        }
    
        products.append(data)
    
    print(products)
    

    总结

    • 遇到的坑 关于CSS selector
    1. 格式必须要对
      • 正确:div > div.ratings > p.pull-rightdiv空格>空格div
      • 错误:'div> div.ratings > p.pull-right(少了空格,会报错)
    2. 直接从Google Chrome中复制selector路径,如果得到了p:nth-child(2)的路径,需要把nth-child(2)改为nth-of-type(2),否则会报错
    • 关于字段的存储类型:

      • 星星数量最好以float或者integer数据类型保存, 由于作业没有给出明确的要求,因此,星星是以字符串''★''的形式打印出来。如果是要以星星数量筛选商品。

      • reviews的数量,作业中也做了处理,将"reviews"的字符串剔除,只保存前面的数字,用integer类型存储,便于之后的利用

    • 星星数量的爬取
      这个应该是本次作业中的难点,思路如下。

      1. 定位星星位置:星星在一个<p>标签下的<span>标签内,并且一个商品有多个星星。因此用soup.select()定位<span>标签的父标签
      2. 分析<span>的类型: 一个商品有多个<span>,分为两类:class_='glyphicon glyphicon-star'代表''★'';class_='glyphicon glyphicon-star-empty代表'☆'
      3. 利用步骤1得到的列表中的每一个tag对象的find_all()方法,分别获取步骤2中分析出的两种<span>,分别得到两个list,用len()函数就可以计算出每一个商品的两种类型的星星数量

    相关文章

      网友评论

          本文标题:python实战计划爬虫作业1_2: 爬取商品信息

          本文链接:https://www.haomeiwen.com/subject/nequjttx.html