正则
使用正则进行图片数据的批量解析爬取
-
如何爬取图片数据
- 方式1:基于requests
- 方式2:基于urllib
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#方式一: import requests import urllib headers = { 'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0' } img_url = 'https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2534506313,1688529724&fm=26&gp=0.jpg' response = requests.get(url=img_url, headers=headers) img_data = response.content # content返回的是二进制形式的响应数据 with open('1.jpg', 'wb') as fp: fp.write(img_data) #方式二: urllib.request.urlretrieve(img_url, './2.jpg')
-
上述两种爬取图片的不同:
使用urllib的方式无法进行UA伪装,而requests的方式可以。
-
需求:爬取明星图库-校花网 (521609.com)中的图片数据
-
分析浏览器工具中elements和network这两个选项卡对应的页面源码呦嗬不同?
- elements中包含的显示的页面源码数据为当前页面所有的数据加载完毕之后对应的完整的页面源码数据。(包含动态加载的数据)
- network中显示的页面源码数据仅仅为某一个单独的请求对应的响应数据(不包含动态加载的数据)
-
如果在进行数据解析的时候,一定是需要对页面布局进行分析,如果页面没有动态加载数据则可以直接使用elements对页面布局进行分析,否则只可以使用network对页面数据进行分析。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
dirName = 'Img' if not os.path.exists(dirName): os.mkdir(dirName) url = 'http://www.521609.com/tuku/' page_text = requests.get(url=url, headers=headers).text # 2.从当前页面解析图片地址 ex = '<li>.*?<img src="(.*?)" alt.*?</li>' img_src_list = re.findall(ex, page_text, re.S) for src in img_src_list: src = 'http://www.521609.com/' + src imgPath = dirName + '/' + src.split('/')[-1] urllib.request.urlretrieve(src, imgPath) print(imgPath, '下载成功!')
关于split的用法Python split()方法 | 菜鸟教程 (runoob.com)
bs4
-
数据解析的作用?
- 用来实现聚焦爬虫
-
网页显示的数据都是存在哪里的?
- 存储在html的标签中或标签的属性中
-
数据解析的原理?
- 指定标签的定位,取出标签或标签属性中的数据
-
bs4解析原理
- 实例化一个beautifulsoup的对象,且将待解析的源码数据加载到该对象中
- 调用beautifulsoup对象中相关方法或者属性进行标签定位和文本数据提取
-
环境安装:
- pip install lxml
- pip install bs4
-
beautifulsoup对象的实例化:
- beautifulsoup(fp,’lxml’):用来将本地存储的html文档中的数据进行解析
- beautifulsoup(page_text,’lxml’):将互联网上请求到的页面源码数据进行解析
-
标签定位
- soup.tagName:只可以定位到第一次出现的tagName标签
- soup.find(’tagName’, attrName=‘value’):属性定位
- soup.findAll():很find一样用作属性定位,只不过findAll返回的是列表
- soup.select(‘选择器’):
- 类选择器
- id选择器
- 层及选择
- ‘大于号’:表示一个层级
- ‘空格’:表示多个层级
-
取数据
- .text 标签下所有的文本内容
- .string 标签下直系的文本内容
-
取属性
-
tag[‘attrName’]