昨日内容回顾
-
selenium基本选择器
find_element_by_... # 单个 find_elements_by_... # 多个 '''支持css选择器和xpath选择器''' -
selenium常用操作
click() send_keys() send_keys(模拟键盘按键) text() get_attribute() '''更多其他操作可参考笔记即可 无需过多记忆''' -
Xpath选择器
'''功能非常强大的一款选择器''' //* //div/a //div//a //div//a[@href='h1'] //div//a[@id='d1']/text() //div//a[1] ... # 该选择器可以实现一行代码完成标签查找和数据筛选 ps:浏览器可以直接帮你书写某个标签的选择器代码(仅限于查找标签) -
selenium其他方法补充
forward() back() ... '''混个眼熟 写入笔记即可''' -
selenium小案例
控制浏览器完成百度用户账号输入 # 隐式等待(推荐使用) 当查找到某个不存在的标签时会等待一会儿 代码固定的 直接拷贝使用即可 # 显示等待(不推荐用) 查找每个标签都会等待一会儿 -
爬取京东商品信息
1.通过selenium自动访问京东 2.获取用户输入的商品名称 3.将商品名称自动填入搜索框中并搜索 4.进入商品展示页研究html规律制定查找策略 5.利用合适的选择器筛选数据 商品的图片路径有一些是存放在src属性中(完整的路径) 有一些存放在其他的属性中(缺少https开头) # 如何分页爬取 如何保存到文件 代码函数封装
今日内容概要
-
作业讲解
-
openpyxl模块
专门用于操作excel表格的(pandas内部使用的也是该模块) -
利用openpyxl将商品写入excel中
-
爬取豆瓣电影排行并写入excel中
-
滑动验证码破解思路
-
爬取贴吧图片数据(复杂)
分页爬取 url制定 函数封装 图片文件指定路径存储
今日内容详细
作业讲解
分页研究
# 思路一
https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&pvid=7e3f15ebfd294c2286272b2071cc295f&page=1&s=56&click=0
https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&pvid=7e3f15ebfd294c2286272b2071cc295f&page=3&s=56&click=0
https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&pvid=7e3f15ebfd294c2286272b2071cc295f&page=5&s=116&click=0
https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&pvid=7e3f15ebfd294c2286272b2071cc295f&page=7&s=176&click=0
'''大胆推测url简写格式'''
https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&page=1
https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&page=2
# 思路二
查看页面的下一页按钮点击即可
next_page = bro.find_element_by_partial_link_text('下一页')
time.sleep(1)
# 点击下一页
next_page.click()
# 再次爬取数据
time.sleep(1)
封装代码
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
def get_start():
# 控制谷歌浏览器
bro=webdriver.Chrome()
# 明确目标网站和请求方式
bro.get("http://www.jd.com")
bro.implicitly_wait(10)
# 获取用户想要搜索的商品名称
# targetGood = input('请输入您想要爬取的商品名称>>>:').strip()
targetGood = '手机' # 先固定写法 方便测试
# 查找商品搜索款 填写内容
btnEle = bro.find_element_by_id('key')
btnEle.send_keys(targetGood)
btnEle.send_keys(Keys.ENTER)
return bro
# 进入商品详情页 爬取数据
def get_good(bro):
# 先查找所有的li标签
li_list = bro.find_elements_by_class_name('gl-item')
"""
注意 bro.find_element有加不加s之分
不加s表示查找单个元素
加s表示查找所有元素
"""
for li in li_list:
img = li.find_element_by_css_selector('.p-img a img')
'''图片的路径有时候在src中有时候在data-lazy-img中'''
img_src = img.get_attribute('src')
if not img_src:
img_src = 'https:' + img.get_attribute('data-lazy-img')
link = li.find_element_by_css_selector('.p-img a').get_attribute('href')
price = li.find_element_by_css_selector('.p-price i').text
name = li.find_element_by_css_selector('.p-name em').text.replace('\n', '')
commit = li.find_element_by_css_selector('.p-commit a').text
# 打印数据 也可以单独拆分
print('''
商品链接:%s
商品图片:%s
商品简介:%s
商品价格:%s
商品销量:%s
''' % (link, img_src, name, price, commit))
# for结束表示一页数据爬取结束 可以开始下一页了
next_page = bro.find_element_by_partial_link_text('下一页')
time.sleep(1)
# 点击下一页
next_page.click()
# 再次爬取数据
time.sleep(1)
try:
get_good(bro)
except Exception:
pass
# 京东商品的评论数就是销量
if __name__ == '__main__': # 当前文件是执行文件的时候才会执行下面代码块
res = get_start()
get_good(res)
"""
将代码封装成函数的口诀
尽量按照功能去封装函数
一个函数尽量只让它具有独立的功能
"""
openpyxl模块
该模块主要用于操作excel表格
针对excel表格文件有两种后缀名
.xls 由excel 03版本之前产生
.xlsx 由excel 03版本之后产生
openpyxl模块针对03版本之前的文件可能会出现兼容性问题
xlrd与xlwt也是用于操作excel表格的模块并且兼容所有版本文件
# 之所以使用openpyxl主要是因为该模块较流行 使用更加简单
# 下载模块
pip3 install openpyxl
任何涉及到处理文件数据的操作步骤都是"读写分离"的
xlrd:读
xlwt:写
openpyxl内部有两个子模块分别控制读写
'''
创建出来的表格如果被wps或者excel打开了 那么代码再次执行会报错
需要你关闭文件之后再执行代码即可
'''
# 1.创建表格
from openpyxl import Workbook
# 初始化excel表格
wb = Workbook()
w1 = wb.create_sheet('工作簿01',0) # 第二个参数还可以控制位置
w2 = wb.create_sheet('工作簿02',1)
w3 = wb.create_sheet('工作簿03',2)
# 还可以二次修改名称
w1.title = '重命名'
# 保存excel文件
wb.save(r'x1.xlsx')
写入数据
# 2.写入数据
from openpyxl import Workbook
# 初始化excel表格
wb = Workbook()
# 创建工作簿
w1 = wb.create_sheet('测试',0)
# 写入普通数据方式1
w1['A3'] = 666
w1['B4'] = 999
# 写入普通数据方式2
w1.cell(row=1,column=3,value=789) # row行 column列 value值
w1.cell(row=2,column=5,value=123)
# 写入公式计算
w1['A5'] = '=sum(A3,B4)' # 逗号表示单个单元格 冒号表示连续区域
w1.cell(row=6,column=1,value='=sum(A1:E5)')
# 保存文件
wb.save('x2.xlsx')
'''写入数据进阶操作'''
userInfo = [[1,'jason',18,'read'],[2,'kevin',28,'run'],[3,'tony',38,'tea']]
w2 = wb.create_sheet('用户信息表',0)
# w2['A1'] = 'id'
# w2['B1'] = 'username'
# w2['C1'] = 'age'
# w2['D1'] = 'hobby'
# count = 2
# for data in userInfo:
# w2['A%s'%count] = data[0]
# w2['B%s'%count] = data[1]
# w2['C%s'%count] = data[2]
# w2['D%s'%count] = data[3]
# count += 1
# 批量插入数据推荐使用append
w2.append(('id','username','age','hobby'))
for i in userInfo:
w2.append(i)
w2.append((4,'jack',18,'music','安徽')) # 多了就多占一列
w2.append((5,'tom','movie',)) # 少了只导致位置错乱
'''当我们在获取数据并写入的时候 如果某些数据缺失 那么也应该补位'''
w2.append((6,'jackson','','study',))
w2.append((7,'owen',None,'read',))
wb.save('x4.xlsx')
读取数据
from openpyxl import load_workbook
# 先明确文件
# wb = load_workbook('x2.xlsx',data_only=True)
wb = load_workbook('x4.xlsx',data_only=True)
# print(wb.sheetnames)
# 再明确工作簿
# w1 = wb['测试']
w1 = wb['用户信息表']
# 通过w1操作工作簿
# 普通数据读取
# print(w1['A1']) # 单元格对象
# print(w1['A1'].value) # 单元格里面的数据 None
# print(w1.cell(row=3,column=1)) # 单元格对象
# print(w1.cell(row=3,column=1).value) # 单元格里面的数据 666
# 公式数据读取
'''默认获取的是公式'''
# print(w1['A5'].value) # =sum(A3,B4)
'''
如果想要获取公式计算之后的数据 需要两步操作
1.在读取excel文件的时候添加data_only=True
2.修改人为操作一下excel文件(修改数据可以理解为只要人为的动了文件就行)
'''
# print(w1['A5'].value) # 1665
"""
read_only=True加了之后 任何修改数据的语句都会报错
不加修改数据的语句不报错但是也不会真正的修改数据
"""
# w1['A7'] = '哈哈哈哈'
# 一行行读取数据
# for row in w1.rows:
# for r in row:
# print(r.value)
# for col in w1.columns:
# for c in col:
# print(c.value)
# 类似于前期数据概览
print(w1.max_row) # 8
print(w1.max_column) # 5
实战演练
# 1.京东商品数据保存(课堂练习)
# 2.链家二手房数据(课堂练习)
要求使用openpyxl完成数据保存
字段尽可能多的拆分 越详细越好
# 3.爬取豆瓣top250电影排行并存储到excel表格(作业)
https://movie.douban.com/top250
电影名称 电影链接 电影简介 电影评分 电影评价
本文概述了如何使用Selenium进行网页自动化操作,包括选择器、基础操作,然后通过Openpyxl模块将京东商品信息爬取并存储到Excel中,涉及数据筛选、滑动验证码破解策略和复杂图片数据抓取技巧。
809

被折叠的 条评论
为什么被折叠?



