十四周内容笔记
day40
scrapy接入selenium
在大目录下创建配置文件
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
class SeleniumToScrapySetting:
driver_path = './'
s = Service(executable_path=ChromeDriverManager(path=driver_path).install())
def creat_chrome(self):
# 引入配置项
Options = webdriver.ChromeOptions()
# 无头浏览器
# 要不要使用无头浏览器,看情况(页面复杂程度)
# 如果不适用无头,需要降低scrapy的线程数
Options.add_argument('--headless')
browser = webdriver.Chrome(service=self.s, options=Options)
# 将浏览器对象返回
return browser
在中间件中添加类
# 要让selenium介入scrapy,需要从下载中间件入手,结果scrapy的request请求
# 导入utils中的SeleniumToScrapySetting类
from utils import SeleniumToScrapySetting
from scrapy.http import HtmlResponse
class SeleniumDownloaderMiddleware:
def __init__(self):
# OJ:object
# 实例化selenium创建的浏览器对象
ChromeOJ = SeleniumToScrapySetting()
self.browser_ = ChromeOJ.creat_chrome()
def closeSpider(self):
# 自定义关闭浏览器的方法,等scrapy结束以后进行调用,关闭创建的浏览器对象
self.browser_.quit()
def process_request(self, request, spider):
"""链接访问前的请求配置"""
# request:表示请求,其中已经包含了将要请求的信息
self.browser_.get(url=request.url)
# HtmlResponse方法负责将构造好的response对象返回给引擎,再通过爬虫中间件将其发送给爬虫进行处理。
# HtmlResponse即负责网页相应结果的构造,又负责返回响应结果
return HtmlResponse(url=request.url, body=self.browser_.page_source, request=request, encoding='utf-8')
def process_response(self, request, response):
"""拿到的响应结果做处理的位置"""
return response
def process_exception(self, request, exception):
"""如果请求、相应结果报错,使用此方法进行异常处理"""
pass
在设置中“告知“scrapy
DOWNLOADER_MIDDLEWARES = {
# "ChinaNews.middlewares.ChinanewsDownloaderMiddleware": 543,
# "ChinaNews.middlewares.ChinanewsUserAgentDownloaderMiddleware": 100,
"ChinaNews.middlewares.SeleniumDownloaderMiddleware": 50,
}
day42
到此为止,网课的python基础和爬虫就结束了,开始自动化办公了,主要是以下内容
1.python操作Excel
2.python操作pdf
3.python操作word文档
4.python自动发邮件
5.python破解密码
6.RPA(机器人流程自动化)工具
01-python写入Excel
1.Excel后缀名
Excel2007以前,Excel文件的后缀名为xls,Excel2007以后,后缀名为xlsx,xls的文件单表最大保存(65536行,256列),xlsx的文件最大保存(1048576行,16384列),xlsx文件与xls文件保存同样的数据,文件更小了,运行速度更快了。
2.xls读写使用xlrd、xlwt模块,xlsx文件读写使用openpyxl模块。
3.新版的Excel向前兼容,还可以打开后缀名为xls的文件。
先讲xls的读写
import xlwt
# 第一步:如果本地没有Excel文件存在,先创建
# Workbook():一个Excel文件学名:工作簿(workbook)
wb = xlwt.Workbook()
# 补充:如果文件已经存在,也可以给workbook方法指定打开哪个文件
# xlwt.workbook('小学成绩表.xls')
# 第二步:从工作簿中创建工作表(worksheet)
# add_sheet()
wb.add_sheet('一年级一班')
ws = wb.add_sheet('一年级二班')
# 补充:xlwt没办法删除无用的工作表
# 第三步:向工作表内的单元格(cell)中写入数据
# xlwt给定下标(行列号)从0开始
# write方法:write(行号, 列号, 内容)
title = ('姓名', '数学', '语文', '英语')
for i in range(len(title)):
ws.write(0, i, title[i])
# 补充:xlwt模块是没有办法指定一个非自己创建的工作表的,没有办法指定xlwt向任意一张已存在的表写入数据。
# 第四步:保存文件
wb.save('小学成绩表.xls')
# 补充:文件不存在叫保存,文件原本就存在,叫做覆盖
02-python读Excel
import xlrd
# 第一步:读取一个已经存在的文件
# open_workbook()
wb = xlrd.open_workbook('小学成绩表.xls')
# 第二步:查看已存在的所有工作表
# sheet_names()
print(wb.sheet_names())
# 第三步:指定某张工作表
# wb.sheet_by_name():通过名字指定
# wb.sheet_by_index():通过下标指定
ws_1 = wb.sheet_by_name('一年级二班')
print(ws_1)
# 返回:Sheet 1:<一年级二班>
ws_2 = wb.sheet_by_index(0)
print(ws_2)
# 返回:Sheet 0:<一年级一班>
# 第四步:查看表中的最大行列数
max_row = ws_1.nrows
max_col = ws_1.ncols
print(f'最大行列数为{max_row}行{max_col}列')
# 第五步:获取单元格中的数据
# cell(行号, 列号)
a1 = ws_1.cell(0, 0)
print(a1, type(a1))
# 返回:text:'姓名' <class 'xlrd.sheet.Cell'>
# 使用value查看指定单元格类(对象)中的内容
print(a1.value)
# 返回:姓名
# 尝试将“一年级二班”工作表中的所有内容拿出来
# 自己写的
for i in range(ws_1.ncols):
print(ws_1.cell(0, i).value, end=' ')
# 老师写的
for i in range(max_row):
for j in range(max_col):
print(ws_1.cell(i, j).value, end='\t')
print()
03-xlrd和xlwt组合使用
问题:在已知的一年级二班原有数据的基础上添加新的数据,添加四位学生及其各自的三科成绩。
import xlrd
import xlwt
# 第一步:先读取出原有数据占位
wb_rd = xlrd.open_workbook('小学成绩表.xls')
ws_rd = wb_rd.sheet_by_name('一年级二班')
max_row, max_col = ws_rd.nrows, ws_rd.ncols
print(max_row, max_col)
# 返回:1 4
# 第二步:创建一个新的工作簿,写入原有内容,再写入新内容
wb_wt = xlwt.Workbook()
ws_wt = wb_wt.add_sheet('一年级二班') # type:xlwt.Worksheet
for i in range(max_row):
for j in range(max_col):
ws_wt.write(i, j, ws_rd.cell(i, j).value)
# 添加四位学生的信息
names = ['a', 'b', 'c', 'd']
for i in range(max_row, max_row + len(names)):
ws_wt.write(i, 0, names[i-1])
for j in range(1, 4):
import random
ws_wt.write(i, j, random.randint(0, 100))
wb_wt.save('小学成绩表.xls')
注意:xlwt补充的那些内容因为xlwt的性质,不得不使用xlwt和xlrd互补形式,以创建来代替修改的形式,对元数据进行迁移、修改。
此程序只能执行一次,不能执行多次。