通过Python读写Excel,实现爬虫的两个方案
1、需求背景
表哥从事某公司的物流管理工作,说公司系统的历史快递的物流信息丢失了,数据接近15万条…原本是系统直接对接信息,但因开发人员没缓存,导致19年前的数据丢失,快递公司后台端口也给迭代了,现在只能在快递公司人工客服里面查询,把结果保存下来。悲剧的是公司系统开发人员离职了,这个锅就落到表哥头上了,现在他需要做的是复制快递单号到对应的客服网站,点击查询,然后将查询结果保存下来,面对接近15万条这么庞大的数据,那得查询到猴年马月去了…这不就找我来帮忙了,话不多说,接下来看看具体的实现思路和代码演示
2、代码实现
需要查询的快递单号:Express_number.xlsx,存放在ExpressInquiry项目的Data文件夹下,部分数据存储截图如下:
访问地址为:http://online.yto.net.cn/?view=index.html
查询结果截图如下:
查询API响应内容如下:
下面会写到两种实现方法:
方法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
上一篇: 列表、元组和字典
推荐阅读
-
利用python的爬虫技术实现两个不同的本地网页内容合并到一个网页中
-
Python 通过requests实现腾讯新闻抓取爬虫的方法
-
python实现两个excel数据匹配,最终写入新的excel文件
-
python 通过使用pandas的实现的Excel的批量转换CSV文件的处理
-
通过Python读写Excel,实现爬虫的两个方案
-
python 三种方法实现对Excel表格的读写
-
Python实现爬虫抓取与读写、追加到excel文件操作示例
-
Python通过Openpyxl读写Excel的初级教程
-
利用python的爬虫技术实现两个不同的本地网页内容合并到一个网页中
-
Python实现读写Excel和修改Excel的代码