zoukankan      html  css  js  c++  java
  • 实例学习——爬取豆瓣网TOP250数据

      开发环境:(Windows)eclipse+pydev

      网址:https://book.douban.com/top250?start=0

    from lxml import etree        #解析提取数据
    import requests               #请求网页获取网页数据
    import csv                    #存储数据
    
    fp = open('D:Pyprojectdouban.csv','wt',newline='',encoding='UTF-8')      #创建csv文件
    writer = csv.writer(fp)
    writer.writerow(('name','url','author','publisher','date','price','rate','comment'))  #写入表头信息,即第一行
    
    urls = ['https://book.douban.com/top250?start={}'.format(str(i)) for i in range(0,250,25)]   #构建urls
    
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}
    
    for url in urls:                     #循环url,先抓大,后抓小(!!!重要,下面详解)
        html = requests.get(url,headers = headers)
        selector = etree.HTML(html.text)
        infos = selector.xpath('//tr[@class="item"]')
        for info in infos:
            name = info.xpath('td/div/a/@title')
            url = info.xpath('td/div/a/@href')
            book_infos = info.xpath('td/p/text()')[0]
            author = book_infos.split('/')[0]
            publisher =book_infos.split('/')[-3]
            date = book_infos.split('/')[-2]
            price = book_infos.split('/')[-1]
            rate = info.xpath('td/div/span[2]/text()')
            comments = info.xpath('td/p/span/text()')
            comment = comments[0] if len(comments) != 0 else ''
            writer.writerow((name,url,author,publisher,date,price,rate,comment))   #写入数据
    fp.close()                          #关闭csv文件,勿忘

    成果展示:

    #乱码错误,用记事本打开,另存为UTF-8文件可解决

    本例主要学习csv库的使用与数据批量抓取方式(即先抓大,后抓小,寻找循环点)

    csv库创建csv文件及写入数据方式:

    import csv
    fp = ('C://Users/LP/Desktop/text.csv','w+')
    writer = csv.writer(fp)
    writer.writerow('id','name')
    writer.writerow('1','OCT')
    writer.writerow('2','NOV')                #写入行
    fp.close()

    数据批量抓取:

    通过类似于BeautifulSoup中的selector()删除谓语部分不可行,思路应为“先抓大,后抓小,寻找循环点”(手写,非copy xpath)

    打开chrome浏览器进行“检查”,通过“三角形符号”折叠元素,找到完整的信息标签,如下图

    (selector()获取数据集中最大区域,遵循路径表达式,第一个字符串前置)

     后每个单独的数据(名字,价格等)另取:

    如 name,归属:<a>—><div>—><td>

     所以:(当归属指向不变时,取小范围的) 

     name = info.xpath('td/div/a/@title')
  • 相关阅读:
    Java程序执行超时——Future接口介绍
    JENKINS 打包发布脚本
    获取servletContext springMvc获取servletContext
    14.19 InnoDB and MySQL Replication InnoDB 和MySQL 复制:
    14.18.1 The InnoDB Recovery Process InnoDB 恢复进程:
    perl 获取文件内容里第一个AAA和最后一个AAA
    14.18 InnoDB Backup and Recovery 备份和恢复:
    职业素养与职业声誉——北漂18年(62)
    Openstack组件实现原理 — Nova 体系结构
    Openstack组件实现原理 — Nova 体系结构
  • 原文地址:https://www.cnblogs.com/junecode/p/11443471.html
Copyright © 2011-2022 走看看