本篇文章涉及到数据解析方面的知识(聚焦爬虫)
在看这篇文章之前,建议读者有一定的爬虫相关的基础知识,零基础的同学请移步
以下是本篇文章正文内容,建议使用PyCharm等工具进行实践
1、聚焦爬虫
大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据。
2、数据解析的分类:
3、数据爬取的流程可以修改为:
4、数据解析原理
解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储
因此,数据解析的步骤如下:
正则表达式的相关内容可以自行学习一下,不用背,会查就行
下面直接开始实战
1、需求
爬取糗事百科中热图模块下的所有图片
地址:https://www.qiushibaike.com/imgrank/
2、分析
所有的图片都是有图片地址的
使用content可以存储二进制文件(图片,见下编码1)
进行聚焦爬虫,获取src路径,正则表达式如下: 3、编码 首先,可以先试一试爬一张图片,代码如下: 代码如下: 注意看注释 代码如下,与上一段代码进行对比: 1、soup.tagName 2、soup.find() 3、soup.find_all() 4、soup.select() 5、获取标签之间的文本数据 6、获取标签中的属性值 1、需求 爬取三国演义小说所有的章节标题和内容 2、分析 3、编码 XPath具有十分强大的选择功能,有一百多种内置函数,几乎可以对我们所有需要选择的节点的内容匹配和节点处理提供支持。 是最通用的数据解析方式 原理: 常用xpath表达式: 注意:/表示根标签,./表示当前标签 1、需求 爬取58二手房的房源信息 2、编码 1、需求 解析下载图片数据 2、编码 注意:这个网站可能被爬了太多次,已经设置了防护措施,所以这里其实是爬不了的,大家看代码学习一下方法就好。 1、需求 爬取全国城市的名称 2、编码
ex='
爬一张图片试一试
import requests
if __name__ == "__main__" :
# UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
}
# 指定图片的URL
url = 'https://pic.qiushibaike.com/system/pictures/12383/123839033/medium/U1LTJQIQJDP8TCKP.jpg'
# 发起请求,携带参数
requests.get(url=url,headers=headers)
# 获取响应对象
response = requests.get(url=url,headers=headers)
# 获取响应数据,content返回二进制形式的图片
jpg = response.content
with open('./a.jpg','wb')as fp:
fp.write(jpg)
爬取第一页所有的图片
import requests
import re
import os
if __name__ == "__main__" :
# 创建一个文件夹,保存图片
if not os.path.exists('./图片'):
os.mkdir('./图片')
# UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
}
# 指定URL
url = 'https://www.qiushibaike.com/imgrank/'
# 通用爬虫对整张页面进行爬取
# 发起请求,携带参数
requests.get(url=url,headers=headers)
# 获取响应对象
response = requests.get(url=url,headers=headers)
# 获取响应数据
page_text = response.text
# 使用聚焦爬虫,取出所有的图片
ex='
爬取所有页数的图片
import requests
import re
import os
if __name__ == "__main__" :
# 创建一个文件夹,保存图片
if not os.path.exists('./所有图片'):
os.mkdir('./所有图片')
# UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
}
# 指定URL模版
url = 'https://www.qiushibaike.com/imgrank/page/%d/'
for pageNum in range(1,14):
# 对应页面的url
new_url = format(url%pageNum)
# 通用爬虫对整张页面进行爬取
# 发起请求,携带参数
requests.get(url=url,headers=headers)
# 获取响应对象
response = requests.get(url=new_url,headers=headers)
# 获取响应数据
page_text = response.text
# 使用聚焦爬虫,取出所有的图片
ex='
3 bs4解析
3.1 环境安装
1. 需要将pip源设置为国内源,阿里源、豆瓣源、网易源等
2. windows
(1)打开文件资源管理器(文件夹地址栏中)
(2)地址栏上面输入 %appdata%
(3)在这里面新建一个文件夹 pip
(4)在pip文件夹里面新建一个文件叫做 pip.ini ,内容写如下即可
[global]
timeout = 6000
index-url = https://mirrors.aliyun.com/pypi/simple/
trusted-host = mirrors.aliyun.com
3. linux
(1)cd ~
(2)mkdir ~/.pip
(3)vi ~/.pip/pip.conf
(4)编辑内容,和windows一模一样
4. 需要安装:pip install bs4
bs4在使用时候需要一个第三方库,把这个库也安装一下
pip install lxml
3.2 bs4的数据解析原理
3.3 BeatuifulSoup对象的实例化
from bs4 import BeautifulSoup
# 1、将本地的html文档中的数据加载到该对象中
fp = open('./test.html',encoding=utf-8)
soup = Beautiful(fp,'lxml')
# 2、将互联网上的html文档中的数据加载到该对象中
page_text = response.text
soup = BeautifulSoup(page_text,'lxml')
3.4 BeautifulSoup对象的属性和方法
# 返回html中第一次出现的tagname标签
soup.a
soup.div
# soup.find('tagname'),返回的和soup.tagname一样
soup.find('div')
# soup.find('tagname',class_/id/attr='')
soup.find('div',class_'song')
# soup.find_all('tagname'),返回所有符合要求的标签(列表)
soup.find_all('a')
# 返回一个列表,选择器包括id选择器,类选择器、标签选择器
soup.select('.classname')
# 层级选择器,> 表示一个层级
soup.select('.classname > ul > li > a')
# 层级选择器,空格表示多个层级
soup.select('.classname > ul a')
# 获取a标签的文本数据,text、string、get_text()
# text和get_text()可以获取标签下的所有的文本内容,即使不属于直系内容
soup.a.text
soup.a.get_text()
# string只可以获取该标签下直系的文本内容
soup.a.string
soup.a['属性名称']
3.5 实战:爬取小说所有的章节的内容
http://www.shicimingju.com/book/sanguoyanyi.html
import requests
import re
import os
from bs4 import BeautifulSoup
if __name__ == "__main__":
# UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
}
# 对首页数据进行爬取
url = 'https://www.shicimingju.com/book/sanguoyanyi.html'
# 获取数据
page_text = requests.get(url=url, headers=headers).text
# 在首页中解析出章节的标题和详情页的url
# 1、实例化
soup = BeautifulSoup(page_text, 'lxml')
# 2、解析标题和url
li_list = soup.select('.book-mulu > ul > li')
# 打开文件
fp = open('./sanguo.txt', 'w', encoding='utf-8')
for li in li_list:
# 获取a标签的标题和href
title = li.a.string
detail_url = 'https://www.shicimingju.com' + li.a['href']
# 对详情页发起请求
detail_page_text = requests.get(url=detail_url, headers=headers).text
# 解析章节的内容
detail_soup = BeautifulSoup(detail_page_text, 'lxml')
dic_tag = detail_soup.find('div', class_='chapter_content')
# 获取到了内容
content = dic_tag.text
# 持久化存储
fp.write(title + ':' + content + '\n')
4 xpath解析
4.1 原理
4.2 环境安装
pip install lxml
4.3 实例化对象
from lxml import etree
etree.parse(filepath)
etree.HTML('page_text')
4.4 调用xpath方法捕获数据
xpath('xpath表达式')
# 实例化一个etree对象
tree = etree.parse('./a.html')
# 定位标签 返回列表,存储了element类型对象(一个或多个)
r = tree.xpath('/html/head/title') # ‘/’表示从根节点开始定位,一个层级
r = tree.xpath('/html//title') # '//'表示多个层级
r = tree.xpath('//title') # 表示从任意位置定位title标签
# 定位属性 返回列表,写法:标签[@属性=“属性值”]
r = tree.xpath('//div[@class="a"]') # 定位到class为a的所有div
# 索引定位 返回列表,索引从1开始
r = tree.xpath('//div[@class="a"]/p[3]')#定位到class为a的div下的第三个p标签
# 取文本1 返回列表,写法:标签/text()获取直系文本内容
r = tree.xpath('//div[@class="a"]//li[1]/a/text()')
# 取文本2 返回列表,写法:标签//text() 获取所有的文本内容
r = tree.xpath('//div[@class="a"]//li[1]//text')
# 取属性 返回列表,写法:标签/@属性名称
r = tree.xpath('//div[@class="a"]/img/@src')
4.5 实战:爬取58二手房的房源信息
https://sy.58.com/ershoufang/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT&PGTID=0d100000-000b-cda5-35a9-c4d948f85c33&ClickID=2
import requests
import re
from lxml import etree
if __name__ == "__main__" :
# UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
}
# 指定url
url = 'https://sy.58.com/ershoufang/'
# 获取页面数据
page_text = requests.get(url = url,headers=headers).text
# 数据解析
# 1、实例化
tree = etree.HTML(page_text)
# 2、调用xpath定位li标签
li_list = tree.xpath('//ul[@class="house-list-wrap"]/li')
# 3、获取a标签
fp = open('58.txt','w',encoding='utf-8')
for li in li_list:
title = li.xpath('./div[2]/h2/a/text()')[0]
fp.write(title)
4.6 实战:解析下载图片数据
http://pic.netbian.com/4kqiche/
import requests
import re
import os
from lxml import etree
if __name__ == "__main__" :
# 创建一个文件夹,保存图片
if not os.path.exists('./所有图片'):
os.mkdir('./所有图片')
# UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
}
# 指定url
url = 'http://pic.netbian.com/4kqiche/'
# 获取页面数据
response = requests.get(url = url,headers=headers)
# response.encoding = 'utf-8'
page_text = response.text
# 数据解析
# 1、实例化
tree = etree.HTML(page_text)
# 2、调用xpath定位
li_list = tree.xpath('//ul[@class="clearfix"]/li')
# 3、获取src属性值
for li in li_list:
src = 'http://pic.netbian.com'+li.xpath('./a/img/@src')[0]
title = li.xpath('./a/img/@alt')[0]+'.jpg'
title = title.encode('iso-8859-1').decode('gbk')
# 持久化存储
img_data = requests.get(url = src,headers=headers).content
img_path = '所有图片/'+title
with open (img_path,'wb')as fp:
fp.write(img_data)
4.7 实战:爬取全国城市名称
https://www.aqistudy.cn/historydata/
import requests
import re
import os
from lxml import etree
if __name__ == "__main__" :
# UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
}
# 指定url
url = 'https://www.aqistudy.cn/historydata/'
# 获取页面数据
response = requests.get(url = url,headers=headers)
page_text = response.text
# 数据解析
# 1、实例化
tree = etree.HTML(page_text)
# 2、调用xpath定位
li_list_h = tree.xpath('//div[@class="hot"]/div[2]/ul/li')
li_list_c = tree.xpath('//div[@class="all"]/div[2]/ul')
city = []
# 3、获取
for li in li_list_h:
host_city_name = li.xpath('./a/text()')[0]
city.append(host_city_name)
for li in li_list_c:
all_city_name_li = li.xpath('./div[2]/li')
for lii in all_city_name_li:
all_city_name = lii.xpath('./a/text()')[0]
city.append(all_city_name)
print(city)