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变量与常量
Jun 02 Python
Python中运算符"=="和"is"的详解
Oct 08 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 26 Python
三步实现Django Paginator分页的方法
Jun 11 Python
Python搭建Spark分布式集群环境
Jul 05 Python
python随机生成库faker库api实例详解
Nov 28 Python
Python3的unicode编码转换成中文的问题及解决方案
Dec 10 Python
Python制作简易版小工具之计算天数的实现思路
Feb 13 Python
Django更新models数据库结构步骤
Apr 01 Python
Python selenium使用autoIT上传附件过程详解
May 26 Python
Python venv虚拟环境配置过程解析
Jul 08 Python
python基础之爬虫入门
May 10 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设计模式中的工厂模式
2008/06/12 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
jquery dialog键盘事件代码
2010/08/01 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
js实现开启密码大写提示
2016/12/21 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
vue中轮训器的使用
2019/01/27 Javascript
图文详解vue框架安装步骤
2019/02/12 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
Python3指定路径寻找符合匹配模式文件
2015/05/22 Python
Python 内置函数complex详解
2016/10/23 Python
Django视图之ORM数据库查询操作API的实例
2017/10/27 Python
python实现Floyd算法
2018/01/03 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
python实现log日志的示例代码
2018/04/28 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
2020/03/09 Python
泰国第一的化妆品网站:Konvy
2018/02/25 全球购物
什么是servlet
2012/05/08 面试题
vue+django实现下载文件的示例
2021/03/24 Vue.js
幼儿教师培训感言
2014/03/08 职场文书
公司租房协议书
2014/10/14 职场文书
2014年办公室文秘工作总结
2014/12/09 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
家长对孩子的寒假评语
2015/10/09 职场文书
导游词之台湾阿里山
2019/10/23 职场文书