py爬虫数据到本地Excel表格

效果图

需要爬取的网页和内容

程序目的:根据公众号文章中的内容,爬取文章的标题、发布时间、责任人署名、文章链接,将这个python程序打包成为exe文件,在运行exe文件时可以爬取html的内容并保存为本地的Excel表格。

所含有的知识点
  1. requests爬虫请求
  2. 时间戳
  3. 表格操作,合并单元格、表格文字加粗、文字居中
  4. python保存为exe
  5. exe获取当前运行程序的路径

python脚本打包成exe文件获取当前路径的问题

【文章推荐】python获取程序执行文件路径方法

import os
import sys
# 确定应用程序是脚本文件还是被冻结的exe
if getattr(sys, 'frozen', False):
    # 获取应用程序exe的路径
    path = os.path.dirname(sys.executable)
elif __file__:
    # 获取脚本程序的路径
    path = os.path.dirname(__file__) 
print(path)

完整代码

from asyncio.windows_events import NULL
from doctest import Example
import importlib
from pathlib import Path
from lxml import etree
import re
from urllib import request, response
import requests 
from urllib import request
import re #进行数据清洗要导入此模块
from lxml import etree
import xlsxwriter
from asyncio import sleep
import xlwt
import xlsxwriter 
from datetime import date,datetime
from openpyxl import load_workbook
import time
import os
import sys

# 获取所有的推文链接
def GetSiteList(start, end,path):
  siteLists = []
  print("\n程序正在运行...")
  for i in range(start, end):
    parser = etree.HTMLParser(encoding='utf-8')
    try:
      tree = etree.parse(path+str(i)+".html", parser=parser)
    except Exception as result:
      print("错误:你保存的html文件名称错误,正确文件名称为:1.html、2.html、3.html,请重新运行程序。")
      pass 

    html = etree.tostring(tree,encoding="utf-8").decode()
    result = tree.xpath("//*[@class='weui-desktop-mass-appmsg__title']/@href")
    siteLists.extend(result)
    return siteLists

# 获取所有推文中的责任姓名
def GetName(siteList,path):
  headers = {"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36 Edg/105.0.1343.33"}
  # 创建表格
  workbook = xlsxwriter.Workbook(path+'官微每月作品表.xlsx')
  worksheet = workbook.add_worksheet()
  worksheet.merge_range('A1:I1',"记者团官方微信公众号 每月作品表汇总")
  bold = workbook.add_format({'bold': True,"align":"center"})
  worksheet.write('A1', '记者团官方微信公众号 每月作品表汇总', workbook.add_format({'bold': True,"size":15,"align":"center"}))
  worksheet.write('A2', '日期', bold)
  worksheet.write('A2', '日期', bold)
  worksheet.write('B2', '选题名称', bold)
  worksheet.write('C2', '编辑', bold)
  worksheet.write('D2', '校对', bold)
  worksheet.write('E2', '文字', bold)
  worksheet.write('F2', '图片', bold)
  worksheet.write('G2', '视频', bold)
  worksheet.write('H2', '音频', bold)
  worksheet.write('I2', '学生主编', bold)
  worksheet.write('J2', '推文链接', bold)
  time.sleep(0.5)

  parser = etree.HTMLParser(encoding='utf-8')
  line = 2
  alignCenter = workbook.add_format({"align":"center"})
  for i in range(len(siteList)-1,0,-1):
    line = line + 1
    # dict = {"time":NULL, "activity":NULL, "edit":NULL, "text":NULL, "proofreading":NULL, "picture":0, "video":NULL}    
    reponse = request.urlopen(siteList[i]).read().decode()

    try:
      pat1 = r"var ct = \"(\d+)\""        
      date1 = re.search(pat1, reponse).group(1)
      date1 = int(date1)
      #转换为其他日期格式,如:"%Y-%m-%d %H:%M:%S"
      timeArray = time.localtime(date1)
      otherStyleTime = time.strftime("%m月%d日", timeArray)
      worksheet.write('A'+str(line), otherStyleTime,alignCenter)
      print(otherStyleTime,end=" ")
    except Exception as result:
      try:
        pat2 = r"window.ct = \'(\d+)\'"
        date2 = re.search(pat2, reponse).group(1)
        date2 = int(date2)
        timeArray2 = time.localtime(date2)
        otherStyleTime2 = time.strftime("%m月%d日", timeArray2)
        worksheet.write('A'+str(line), otherStyleTime2,alignCenter)
        print(otherStyleTime2,end=" ")
      except Exception as result:
        pass

    html = etree.HTML(reponse)        
    activity_name = html.xpath("//h1")[0].text.strip() #标题
    worksheet.write('B'+str(line), activity_name,alignCenter)
    print(activity_name)

    try:
      bianJi = r"编辑:([\u4e00-\u9fa5].*?)<"
      bianJi = re.search(bianJi, reponse).group(1).replace("&nbsp;"," ")
      worksheet.write('C'+str(line),bianJi,alignCenter)
        #print(bianJi)
    except Exception as result:
      pass

    try:
      jiaoDui = r"校对:([\u4e00-\u9fa5].*?)<"
      jiaoDui = re.search(jiaoDui, reponse).group(1).replace("&nbsp;"," ")
      worksheet.write('D'+str(line),jiaoDui,alignCenter)
    #print(jiaoDui)
    except Exception as result:
      pass

    try:
      text = r"文字:([\u4e00-\u9fa5].*?)<"
      text = re.search(text, reponse).group(1).replace("&nbsp;"," ")
      worksheet.write('E'+str(line),text,alignCenter)
      #print(text)
    except Exception as result:
      pass

    try:
      picture = r"图片:([\u4e00-\u9fa5].*?)<"
      picture = re.search(picture, reponse).group(1).replace("&nbsp;"," ")
      worksheet.write('F'+str(line),picture,alignCenter)
      #print(picture)
    except Exception as result:
      pass

    try:
      video = r"视频:([\u4e00-\u9fa5].*?)<"
      video = re.search(video, reponse).group(1).replace("&nbsp;"," ")
      worksheet.write('G'+str(line),video,alignCenter)
      #print(video)
    except Exception as result:
      pass

    try:
      audio = r"音频:([\u4e00-\u9fa5].*?)<"
      audio = re.search(audio, reponse).group(1).replace("&nbsp;"," ")
      worksheet.write('H'+str(line),audio,alignCenter)
      #print(audio)
    except Exception as result:
      pass

    try:
      zhuBian = r"学生主编:([\u4e00-\u9fa5].*?)<"
      zhuBian = re.search(zhuBian, reponse).group(1).replace("&nbsp;"," ")
      worksheet.write('I'+str(line),zhuBian,alignCenter)
      #print(zhuBian)
    except Exception as result:
      pass

    try:
      worksheet.write('J'+str(line), siteList[i])
    except Exception as result:
      #print("pass")
      pass
      # 关闭工作薄
  workbook.close()


if __name__ == '__main__':
  # 获取文件的路径
  if getattr(sys, 'frozen', False):
    application_path = os.path.dirname(sys.executable)
  elif __file__:
    application_path = os.path.dirname(__file__)

  path = application_path.replace("\\","/")+"/"
  print(path)
  maxNum = input("请输入最大的html文件个数:")
  getSiteList = GetSiteList(1,int(maxNum)+1, path)
  GetName(getSiteList,path)
  print("\nExcel文件位置:"+path+"官微每月作品表.xlsx")
  input("\n程序运行完毕")
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 好的,这是一段使用 Python 操作 Excel 表格的代码示例: 首先,你需要安装 openpyxl 库,这是一个用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件Python 库。你可以使用 pip 安装它: ``` pip install openpyxl ``` 然后,你可以使用以下代码来读取 Excel 表格: ```python import openpyxl # 打开一个工作簿 wb = openpyxl.load_workbook('example.xlsx') # 获取所有的工作表名称 sheets = wb.sheetnames # 获取某个工作表 ws = wb[sheets[0]] # 遍历工作表的每一行 for row in ws.rows: # 遍历每一列 for cell in row: # 输出单元格的值 print(cell.value) ``` 要写入 Excel 表格,你可以使用以下代码: ```python import openpyxl # 创建一个工作簿 wb = openpyxl.Workbook() # 获取当前活动的工作表 ws = wb.active # 写入数据 ws['A1'] = 'hello' ws['B1'] = 'world' # 保存工作簿 wb.save('example.xlsx') ``` 希望这能帮到你! ### 回答2: 使用Python操作Excel表格的最常用方法是使用第三方库openpyxl。以下是一个简单的示例代码,展示了如何使用openpyxl打开一个Excel文件、读取数据、修改数据,并保存修改后的文件。 ```python import openpyxl # 打开Excel文件 wb = openpyxl.load_workbook('example.xlsx') # 选择要操作的工作表 sheet = wb.active # 读取数据 cell_value = sheet.cell(row=1, column=1).value print(cell_value) # 修改数据 sheet.cell(row=1, column=1).value = 'New Value' # 保存修改后的文件 wb.save('example_modified.xlsx') ``` 在上面的示例中,我们使用`openpyxl.load_workbook`函数打开了一个名为`example.xlsx`的Excel文件,并使用`wb.active`选择了默认的工作表。然后,我们使用`sheet.cell`方法读取了第1行第1列单元格的值,并将其打印出来。接下来,我们使用`sheet.cell`方法将第1行第1列单元格的值修改为'New Value'。最后,我们使用`wb.save`方法保存修改后的Excel文件,将其保存为`example_modified.xlsx`。 当然,openpyxl还提供了其他强大的功能,如创建新的工作表、添加数据、删除数据等。你可以查阅openpyxl的官方文档来了解更多关于使用openpyxl操作Excel表格的方法和功能。 ### 回答3: 以下是一段用Python操作Excel表格的代码: ```python import openpyxl # 打开Excel文件 workbook = openpyxl.load_workbook('sample.xlsx') # 选择某个工作表 sheet = workbook['Sheet1'] # 读取单元格的数据 cell_value = sheet['A1'].value print(cell_value) # 修改某个单元格的数据 sheet['B2'] = 'Hello World' # 保存修改后的Excel文件 workbook.save('sample_modified.xlsx') # 关闭Excel文件 workbook.close() ``` 这段代码使用了`openpyxl`库来处理Excel文件。首先通过`load_workbook()`函数打开Excel文件,然后选取了其中的一个工作表。接着通过`sheet['A1'].value`来读取A1单元格的值,并将其打印出来。然后,将'B2'单元格的值修改为'Hello World'。最后,通过`save()`函数将修改后的Excel文件保存为新文件,并使用`close()`函数关闭Excel文件。 上述代码只是一个简单的示例,你可以根据自己的需求进一步扩展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MrFlySand_飞沙

公众号【小知识酷】,搜索获取更

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值