欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

通过Python读写Excel,实现爬虫的两个方案

程序员文章站 2022-03-08 08:08:19
目录1、需求背景2、代码实现2.1、实现方法12.1.1、实现思路2.1.2、代码演示2.2、实现方法22.2.1、实现思路2.2.2、代码演示3、拓展知识1、需求背景表哥从事某公司的物流管理工作,说公司系统的历史快递的物流信息丢失了,数据接近15万条…原本是系统直接对接信息,但因开发人员没缓存,导致19年前的数据丢失,快递公司后台端口也给迭代了,现在只能在快递公司人工客服里面查询,把结果保存下来。悲剧的是公司系统开发人员离职了,这个锅就落到表哥头上了,现在他需要做的是复制快递单号到对应的客服网站,点击...

1、需求背景

表哥从事某公司的物流管理工作,说公司系统的历史快递的物流信息丢失了,数据接近15万条…原本是系统直接对接信息,但因开发人员没缓存,导致19年前的数据丢失,快递公司后台端口也给迭代了,现在只能在快递公司人工客服里面查询,把结果保存下来。悲剧的是公司系统开发人员离职了,这个锅就落到表哥头上了,现在他需要做的是复制快递单号到对应的客服网站,点击查询,然后将查询结果保存下来,面对接近15万条这么庞大的数据,那得查询到猴年马月去了…这不就找我来帮忙了,话不多说,接下来看看具体的实现思路和代码演示

2、代码实现

需要查询的快递单号:Express_number.xlsx,存放在ExpressInquiry项目的Data文件夹下,部分数据存储截图如下:
通过Python读写Excel,实现爬虫的两个方案
访问地址为:http://online.yto.net.cn/?view=index.html
查询结果截图如下:
通过Python读写Excel,实现爬虫的两个方案
查询API响应内容如下:
通过Python读写Excel,实现爬虫的两个方案

下面会写到两种实现方法:
方法1:查询结果通过截图方式保存下来
方法2:查询结果通过文本方式保存至Excel文件
表哥真正的需求是想要截图保存,即方法1,因本文主要的目的是想写写Python中的xlrd和openpyxl库,对Excel的读写操作方法,所以增加了方法2的代码实现

2.1、实现方法1

2.1.1、实现思路

用xlrd读取Excel文件数据,结合selenium的webdriver模拟UI界面操作,用截图方法driver.get_screenshot_as_file(filepath) 保存查询结果

2.1.2、代码演示

# 文件名:save_screenshot.py
import xlrd
from selenium import webdriver
import os
import time
from selenium.webdriver.chrome.options import Options

"""读取excel文件"""
def read_excel(xls_name,sheet_name):
    worksheet = xlrd.open_workbook(xls_name)
    sheet = worksheet.sheet_by_name(sheet_name)
    rows = sheet.nrows
    row_content = []
    for i in range(rows):
        cell = sheet.cell_value(i,0)
        row_content.append(cell)
    return row_content

"""
chrome无头浏览器,打开网站
参数:浏览器窗口宽度、高度、网址
"""
def open_browser(scroll_width,scroll_height,url):
    chrome_options = Options()
    chrome_options.add_argument('- -headless')
    chrome_options.add_argument('- -disable-gpu')
    driver = webdriver.Chrome(chrome_options=chrome_options)
    driver.set_window_size(scroll_width, scroll_height)
    driver.get(url)
    return driver

"""发送快递单号查询"""
def send_ExpressNo(num):
    driver.find_element_by_xpath('//*[@id="text"]').send_keys(num)
    driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[2]/div/div/input[1]').click()
    time.sleep(2)

"""截图并保存"""
def insert_img(driver,filepath):
    driver.get_screenshot_as_file(filepath)

if __name__ == '__main__':
    # chrome无头浏览器,打开网站
    driver = open_browser(1920,888,'http://online.yto.net.cn/?view=index.html')
    # 遍历获取到的excel数据
    for num in read_excel(r'F:\ExpressInquiry\Data\Express_number.xlsx', '1-10000条'):
        save_path = '../Screenshot/1-10000条'
        if os.path.exists(save_path) == False:
            os.mkdir(save_path)
        filepath = save_path + '\\' + str(num) + '.png'
        if os.path.exists(filepath) :
            continue
        # 发送快递单号查询
        send_ExpressNo(num)
        print('发送快递单号 {} 查询'.format(num))
        # 截图并保存
        insert_img(driver,filepath)
        print('快递单号 {} 截图保存成功!'.format(num))
    # 关闭浏览器
    driver.quit()

2.2、实现方法2

2.2.1、实现思路

用openpyxl读取Excel文件数据,结合requests请求查询API,将查询结果回填到Excel

2.2.2、代码演示

# 文件名:save_text.py
import openpyxl
import requests
import json
import re

def ExpressSearchAndSave(xls_name,sheet_name):
    """读取excel文件"""
    wb = openpyxl.load_workbook(xls_name)
    ws = wb.get_sheet_by_name(sheet_name)
    sheet = wb.active
    a_column = ws['A']
    # print(a_column)
    for cell in a_column:
        express_no = cell.value

        """发送快递单号查询,获取响应内容"""
        headers = {"Content-Type": "application/json;charset=utf-8"}
        data = {"action": "CHATING", "question": express_no, "userId": "fewqim8jk1"}
        from_data = json.dumps(data)  # 提交的参数需要是json类型,所以POST请求携带的数据需要序列化一下json.dumps(data)
        r = requests.post('http://online.yto.net.cn/api/robot/chat', data=from_data, headers=headers)
        response = r.json()
        search_result = response['data']['content']

        """将获取到的响应内容,写回excel对应快递单号所在行"""
        new_cell = str(cell)   
        a_num = re.search(r"<Cell '22'.A(.*)>", new_cell).group(1)   # 用正则获取cell单元格的序号值
        ws['C{}'.format(a_num)] = search_result
        print('当前是第 {} 个单元格,获取到的快递单号是:{},查询结果写入成功!\n=========================================================================='.format(a_num,express_no))

        """保存excel文件"""
        wb.save(r'F:\ExpressInquiry\Data\Express_number.xlsx')

if __name__ == '__main__':
    ExpressSearchAndSave(r'F:\ExpressInquiry\Data\Express_number.xlsx','1-10000条')

3、拓展知识

Python读写Excel的库有很多,本文选取的是xlrd和openpyxl
xlwings:简单强大,可替代VBA
openpyxl:简单易用,功能广泛
pandas:使用需要结合其他库,数据处理是pandas立身之本
win32com:不仅仅是Excel,可以处理office;
Xlsxwriter:丰富多样的特性,直接创造一份美观大方的Excel,代码即一切;
DataNitro:作为插件内嵌到Excel中,可替代VBA,在Excel中优雅的使用python
xlutils:结合xlrd/xlwt,老牌python包,需要注意的是你必须同时安装这三个库xlrd、xlwt、xlutils
xlrd- 读取 Excel 文件
xlwt- 写入 Excel 文件
xlutils- 操作 Excel 文件的实用工具,如复制、分割、筛选等

更多关于以上库的对比和详细使用可参考:
1、Python处理Excel模块的对比分析
2、Python开发 之 Python3读写Excel文件(较全)

本文地址:https://blog.csdn.net/luoluoxx0115/article/details/111141286