opempy及Xpath案例

昨日内容回顾

  • selenium模块滑动验证码

    代码破解
    人为输入
    
    # 一般人为操作,但是结合实际做选择
    
  • 爬取汽车之家

  • 爬取京东商品信息

    敲敲敲!!!
    
  • openpyxl模块

  • 创建表格

  • 写数据

    w1['A1'] = 666
    w1.cell(row=1,column=2,value=123)
    
    w1.append([11,22,33,44,55])
    
  • 读数据

    sheetnames
    w1['A1'].value
    

今日内容概要

  • openpyxl模块补充
  • 利用openpy结合爬虫爬取豆瓣电影数据
  • 图片验证码的破解思路
  • b站等复杂案列分析(了解)
  • Xpath选择器

今日内容详细

openpyxl模块结束

from openpyxl import Workbook, load_workbook


# wb = Workbook()
#
# w1 = wb.create_sheet('MySheet')
# w1.append(['id','name','password'])
# w1.append([1,'jason','123'])
# w1.append([2,'kevin','234'])
# w1.append([3,'tom','666'])
#
#
#
# wb.save(r'a.xlsx')


wb = load_workbook(r'a.xlsx')
w1 = wb['MySheet']

# w1.rows获取一行行数据
# for row in w1.rows:
#     # print(row)  # (<Cell 'MySheet'.A1>, <Cell 'MySheet'.B1>, <Cell 'MySheet'.C1>)
#     for data in row:
#         print(data.value)

# w1.columns获取一列列数据
# for col in w1.columns:
#     # print(col)  # (<Cell 'MySheet'.A1>, <Cell 'MySheet'.A2>, <Cell 'MySheet'.A3>, <Cell 'MySheet'.A4>)
#     for c in col:
#         print(c.value)

print(w1.max_row)  # 获取数据总行数
print(w1.max_column)  # 获取表格列字段数量

爬取豆瓣

"""
豆瓣会校验IP的访问频率,你们自己在爬取数据的时候不要频繁的执行
最好加上time.sleep
"""

    
# 当请求头中已经加入了User-Agent和referer还是被拒绝,那么可以考虑直接将请求头里面所有的数据全部带入
"""
在爬取数据的时候不要想着一步到位
	先尝试着爬取一页数据
	之后再考虑多页的情况
"""

# 多页只需要研究url的规律即可
	https://movie.douban.com/top250?start=0&filter=
    https://movie.douban.com/top250?start=25&filter=
    https://movie.douban.com/top250?start=50&filter=
    https://movie.douban.com/top250?start=75&filter=
    # 第一页应该可以写成
    https://movie.douban.com/top250?start=0&filter=
        
        
"""
拔高题:根据获取到的电影链接继续爬取电影更多详细的信息
	导演:
	编剧:
	主演:
	类型: 
	官方网站:
	制片国家/地区:
	语言: 
	上映日期: 
	片长: 
"""

图片验证码

破解思路1:
    python图像识别模块
    	软件:Tesseract-ocr 
    	模块:pytesseract
    # https://blog.csdn.net/qq_38161040/article/details/90668765 
    """由于有现成的模块可以直接识别图片上面的文字,为了避免直接被识别所以图片验证码往往都设计的很模糊很抽象不容易识别"""
    
破解思路2:
    利用第三方服务平台(打码平台)
    # http://sb.daredian.cn/?spm=dm.pc@baidu
    
破解思路3:
    自己人工智能解决

B站案列

不同网站的数据有不同的防爬措施
B站的视频和音频是分开的
# 需对该类型如何破解进行了解和破解思路

Xpath选择器

本质也是用来帮助我查找html标签

# 模拟代码爬取下来的html数据
doc = '''
<html>
 <head>
  <base href='http://example.com/' />
  <title>Example website</title>
 </head>
 <body>
  <div id='images'>
   <a href='image1.html' a="xxx">Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
   <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
   <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
   <a href='image4.html' class='li'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
   <a href='image5.html' class='li li-item' name='items'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
   <a href='image6.html' name='items'><span><h5>test</h5></span>Name: My image 6 <br /><img src='image6_thumb.jpg' /></a>
  </div>
 </body>
</html>
'''
from lxml import etree

# from bs4 import BeautifulSoup
#
# soup = BeautifulSoup(doc,'lxml')
# 固定语句
html = etree.HTML(doc)

# 1 所有节点
# a = html.xpath('//*')  # 匹配所有标签
# 2 指定节点(结果为列表)
# a = html.xpath('//head')  # 通过标签名查找标签
# 3 子节点,子孙节点
# a = html.xpath('//div/a')  # 查找div内部儿子a
# a = html.xpath('//body/a')  # 无数据
# a = html.xpath('//body//a')  # 查找body所有的后代a
# # 4 父节点
# a=html.xpath('//body//a[@href="image1.html"]')  # 查找div内部所有后代a并且href必须是image1.html
# a=html.xpath('//body//a[@a="xxx"]')  # 查找div内部所有后代a并且a属性名对应的属性值必须是xxx
# a = html.xpath('//body//a[1]')  # 从1开始计数
# a = html.xpath('//body//a[1]/..')  # ..表示上一级

# # 也可以这样
# a=html.xpath('//body//a[1]/parent::*')
# # 5 属性匹配
# a=html.xpath('//body//a[@href="image1.html"]')
#
# # 6 文本获取
# a=html.xpath('//body//a[@href="image1.html"]/text()')
# a=html.xpath('//body//a/text()')  # 获取所有后代a里面的文本数据
#
# # 7 属性获取
# a = html.xpath('//body//a/@href')
# # # 注意从1 开始取(不是从0)
# a=html.xpath('//body//a[2]/@href')
# # 8 属性多值匹配
# #  a 标签有多个class类,直接匹配就不可以了,需要用contains
# a=html.xpath('//body//a[@class="li"]')
# a=html.xpath('//body//a[contains(@class,"li")]/text()')
# # 9 多属性匹配
# a=html.xpath('//body//a[contains(@class,"li") or @name="items"]')
# a=html.xpath('//body//a[contains(@class,"li") and @name="items"]/text()')
# # 10 按序选择
# a=html.xpath('//a[2]/text()')
# a=html.xpath('//a[2]/@href')
# # 取最后一个
# a=html.xpath('//a[last()]/@href')
# # 位置小于3的
# a=html.xpath('//a[position()<3]/@href')
# # 倒数第二个
# a=html.xpath('//a[last()-2]/@href')


# # 11 节点轴选择
# # ancestor:祖先节点
# # 使用了* 获取所有祖先节点
# a=html.xpath('//a/ancestor::*')
# # # 获取祖先节点中的div
# a=html.xpath('//a/ancestor::div')
# # attribute:属性值
a=html.xpath('//a[1]/attribute::*')
# # child:直接子节点
# a=html.xpath('//
# ['image6.html']a[1]/child::*')
# # descendant:所有子孙节点
# a=html.xpath('//a[6]/descendant::*')
# # following:当前节点之后所有节点
# a=html.xpath('//a[1]/following::*')
# a=html.xpath('//a[1]/following::*[1]/@href')
# # following-sibling:当前节点之后同级节点
# a=html.xpath('//a[1]/following-sibling::*')
# a=html.xpath('//a[1]/following-sibling::a')
# a=html.xpath('//a[1]/following-sibling::*[2]/text()')
# a=html.xpath('//a[1]/following-sibling::*[2]/@href')
print(a)

作业

1.笔记
2.爬虫案例
posted @ 2021-01-22 13:17  KaiLun  阅读(45)  评论(0)    收藏  举报