网络爬虫06.23

本文概述了如何使用Selenium进行网页自动化操作,包括选择器、基础操作,然后通过Openpyxl模块将京东商品信息爬取并存储到Excel中,涉及数据筛选、滑动验证码破解策略和复杂图片数据抓取技巧。

昨日内容回顾

  • 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
    电影名称  电影链接  电影简介  电影评分  电影评价 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值