Python实现爬虫抓取与读写、追加到excel文件操作示例


Posted in Python onJune 27, 2018

本文实例讲述了Python实现爬虫抓取与读写、追加到excel文件操作。分享给大家供大家参考,具体如下:

爬取糗事百科热门

安装 读写excel 依赖 pip install xlwt
安装 追加excel文件内容 依赖 pip install xlutils
安装 lxml

Python示例:

import csv
import requests
from lxml import etree
import time
import xlwt
import os
from xlutils.copy import copy
import xlrd
data_infos_list = []
headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 '
         '(KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'}
# f = open('C:\\Users\\Administrator\\Desktop\\qiubaibook.csv', 'a+', newline='', encoding='utf-8')
# writer = csv.writer(f)
# writer.writerow(('author', 'sex', 'rank', 'content', 'great', 'comment', 'time'))
filename = 'C:\\Users\\Administrator\\Desktop\\qiubaibook.xls'
def get_info(url):
  res = requests.get(url, headers=headers)
  selector = etree.HTML(res.text)
  # print(res.text)
  htmls = selector.xpath('//div[contains(@class,"article block untagged mb15")]')
  # // *[ @ id = "qiushi_tag_120024357"] / a[1] / div / span 内容
  # //*[@id="qiushi_tag_120024357"]/div[2]/span[1]/i 好笑
  # //*[@id="c-120024357"]/i 评论
  # //*[@id="qiushi_tag_120024357"]/div[1]/a[2]/h2 作者
  # //*[@id="qiushi_tag_120024357"]/div[1]/div 等级
  # // womenIcon manIcon 性别
  for html in htmls:
    author = html.xpath('div[1]/a[2]/h2/text()')
    if len(author) == 0:
      author = html.xpath('div[1]/span[2]/h2/text()')
    rank = html.xpath('div[1]/div/text()')
    sex = html.xpath('div[1]/div/@class')
    if len(sex) == 0:
      sex = '未知'
    elif 'manIcon' in sex[0]:
      sex = '男'
    elif 'womenIcon' in sex[0]:
      sex = '女'
    if len(rank) == 0:
      rank = '-1'
    contents = html.xpath('a[1]/div/span/text()')
    great = html.xpath('div[2]/span[1]/i/text()') # //*[@id="qiushi_tag_112746244"]/div[3]/span[1]/i
    if len(great) == 0:
      great = html.xpath('div[3]/span[1]/i/text()')
    comment = html.xpath('div[2]/span[2]/a/i/text()') # //*[@id="c-112746244"]/i
    if len(comment) == 0:
      comment = html.xpath('div[3]/span[2]/a/i/text()')
    # classes = html.xpath('a[1]/@class')
    # writer.writerow((author[0].strip(), sex, rank[0].strip(), contents[0].strip(), great[0].strip(),
    #         comment[0].strip(), time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))))
    data_infos = [author[0].strip(), sex, rank[0].strip(), contents[0].strip(), great[0].strip(),
           comment[0].strip(), time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))]
    data_infos_list.append(data_infos)
def write_data(sheet, row):
  for data_infos in data_infos_list:
    j = 0
    for data in data_infos:
      sheet.write(row, j, data)
      j += 1
    row += 1
if __name__ == '__main__':
  urls = ['https://www.qiushibaike.com/8hr/page/{}/'.format(num) for num in range(1, 14)]
  for url in urls:
    print(url)
    get_info(url)
    time.sleep(2)
  # 如果文件存在,则追加。如果文件不存在,则新建
  if os.path.exists(filename):
    # 打开excel
    rb = xlrd.open_workbook(filename, formatting_info=True) # formatting_info=True 保留原有字体颜色等样式
    # 用 xlrd 提供的方法获得现在已有的行数
    rn = rb.sheets()[0].nrows
    # 复制excel
    wb = copy(rb)
    # 从复制的excel文件中得到第一个sheet
    sheet = wb.get_sheet(0)
    # 向sheet中写入文件
    write_data(sheet, rn)
    # 删除原先的文件
    os.remove(filename)
    # 保存
    wb.save(filename)
  else:
    header = ['author', 'sex', 'rank', 'content', 'great', 'comment', 'time']
    book = xlwt.Workbook(encoding='utf-8')
    sheet = book.add_sheet('糗百')
    # 向 excel 中写入表头
    for h in range(len(header)):
      sheet.write(0, h, header[h])
    # 向sheet中写入内容
    write_data(sheet, 1)
    book.save(filename)

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python使用cookie库操保存cookie详解
Mar 03 Python
python进阶教程之循环对象
Aug 30 Python
python实现根据月份和日期得到星座的方法
Mar 27 Python
在Django同1个页面中的多表单处理详解
Jan 25 Python
Python新手们容易犯的几个错误总结
Apr 01 Python
python在非root权限下的安装方法
Jan 23 Python
Python实现的根据IP地址计算子网掩码位数功能示例
May 23 Python
Python WSGI的深入理解
Aug 01 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
Dec 28 Python
基于TensorFlow常量、序列以及随机值生成实例
Jan 04 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
Mar 06 Python
4种方法python批量修改替换列表中元素
Apr 07 Python
python numpy和list查询其中某个数的个数及定位方法
Jun 27 #Python
python3解析库lxml的安装与基本使用
Jun 27 #Python
详解Python安装scrapy的正确姿势
Jun 26 #Python
python3解析库BeautifulSoup4的安装配置与基本用法
Jun 26 #Python
Python 修改列表中的元素方法
Jun 26 #Python
Python 找到列表中满足某些条件的元素方法
Jun 26 #Python
python3解析库pyquery的深入讲解
Jun 26 #Python
You might like
PHP操作文件方法问答
2007/03/16 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
PHP两种实现无级递归分类的方法
2017/03/02 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
jQuery简单实现隐藏以及显示特效
2015/02/26 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
2015/04/07 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
js学习阶段总结(必看篇)
2016/06/16 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
详解如何在你的Vue项目配置vux
2018/06/04 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
2019/07/29 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
原生js中运算符及流程控制示例详解
2021/01/05 Javascript
八大排序算法的Python实现
2021/01/28 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
Django用户认证系统 Web请求中的认证解析
2019/08/02 Python
docker django无法访问redis容器的解决方法
2019/08/21 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
病媒生物防治方案
2014/05/13 职场文书
教师求职自荐书
2014/06/14 职场文书
房屋租赁合同解除协议书
2014/10/11 职场文书