文章目录
- 一.正则
- 1.[正则表达式的概念]()
- 2.[正则表达式元字符表](_)
- 3.[正则案例](_)
- 4.批量抓取图片并保存
- 二.BeautifulSoup
- 1.BeautifulSoup中string和text方法的区别
- 2.爬取三国演义全文
- 三.xpath
- 1.提取4k高清图片
- 2.获取58同城二手房信息
- 3.爬取全国城市名
聚焦爬虫是指在拿到一个网页的响应后,对这个网页复杂的信息进行聚焦式的提取,这个提取关键信息的过程往往是爬虫中最核心的部分,我们也把这个提取的过程叫做数据解析,数据解析中最常用的办法有三类,下面结合代码和解析简述一下。
一.正则
1.正则表达式的概念
2.正则表达式元字符表
3.正则案例
4.批量抓取图片并保存
源码以及注释:
import requests # 用于发送请求
import re # 用于正则匹配
import os # 用于文件的操作
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"
} # 设置UA伪装为火狐流浪器
if not os.path.exists('./qiutulibs'): # 检测文件夹是否存在,不存在则创建该文件夹
os.mkdir('./qiutulibs')
for i in range(1, 13): # 设置网页路由
url = f'https://www.qiushibaike.com/imgrank/page/{i}/' # 目标网页
page_text = requests.get(url=url, headers=head).text # 发送请求
ex = r'<div class="thumb">.*?<img src="(.*?)" alt.*?</div>' # 正则匹配的规则:找到符合要求的图片链接
img_src_list = re.findall(ex, page_text, re.S) # 正则匹配返回的text内容
for src in img_src_list: # 遍历链接,依次抓取图片
src = 'http:' + src # 设置新url
img_data = requests.get(url=src, headers=head).content # 访问并以二进制形式保存数据
img_name = src.split('/')[-1] # 切片获取图片名称
img_path = './qiutulibs/' + img_name # 设置图片保存路径
with open(img_path, 'wb') as fp: # 创建文件指针
fp.write(img_data) # 保存文件
二.BeautifulSoup
1.BeautifulSoup中string和text方法的区别
string返回的是指定标签内的文字,不包含指定标签的子标签里面的文字
text方法返回的是该标签内包含子标签在内的所有文字
以下面代码以及结果为例子
源码:
import requests
from bs4 import BeautifulSoup
url = 'https://www.baidu.com/'
response = requests.get(url=url)
response.encoding = 'utf-8'
page = response.text
soup = BeautifulSoup(page, 'lxml')
body = soup.find("body")
print(body.string)
print(body.text)
结果:
None
新闻 hao123 地图 视频 贴吧 登录 更多产品 关于百度 About Baidu ©2017 Baidu 使用百度前必读 意见反馈 京ICP证030173号
2.爬取三国演义全文
import urllib.request # 用于发送请求
from bs4 import BeautifulSoup # BeautifulSoup
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"
} # 设置UA伪装为火狐流浪器
url = 'https://www.shicimingju.com/book/sanguoyanyi.html' # 指定url
request = urllib.request.Request(url=url, headers=head) # 创建请求头
page_text = urllib.request.urlopen(request) # 获取响应数据
soup = BeautifulSoup(page_text, 'lxml') # 用BeautifulSoup把网页标签解析成树状结构
li_list = soup.select(".book-mulu > ul > li") # 用select方法通过层级选择的方式找到目标数据
fp = open('./sanguo.txt', 'w', encoding='utf-8') # 创建文件指针
for li in li_list: # 遍历各章节,获取内容
title = li.a.string # 通过BeautifulSoup解析后可直接取数据
detail_url = 'https://www.shicimingju.com' + li.a['href'] # 设置新url
request2 = urllib.request.Request(url=detail_url, headers=head) # 创建请求头
detail_page_text = urllib.request.urlopen(request2) # 发送请求
detail_soup = BeautifulSoup(detail_page_text, 'lxml') # 用BeautifulSoup把网页标签解析成树状结构
div_tag = detail_soup.find('div', {'class': 'chapter_content'}) # 找到class属性为chapter_content的div标签
content = div_tag.text # 取该标签的内容
fp.write(title + ":" + content + '\n') # 存储
print(title, '爬取成功!!!') # 提示语句
三.xpath
1.提取4k高清图片
import os # 文件的操作
import urllib.request # 发送请求的旧版方式
import requests # 发送请求的新版方式
from lxml import etree # 运用xpath进行数据解析
if not os.path.exists('./pic_4k'): # 判断文件是否存在,不存在则创建文件
os.mkdir('./pic_4k')
url = 'https://pic.netbian.com/4kmeishi/' # 目标url
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"
} # 设置UA伪装为火狐流浪器
request = urllib.request.Request(url=url, headers=head) # 遍历请求头
page_text = urllib.request.urlopen(request).read().decode('gbk') # 根据网站的编码方式设置相应的解码方式
tree = etree.HTML(page_text) # 用etree处理数据
li_list = tree.xpath('//div[@class="slist"]/ul/li') # 用xpath方式聚焦数据,@后面跟的是属性值,//表示跳过多个层级
for li in li_list: # 遍历各个li标签,找到图片链接和图片名字
img_src = 'https://pic.netbian.com' + li.xpath('./a/img/@src')[0] # 设置新url
img_name = li.xpath('./a/img/@alt')[0] + '.jpg' # 用相对路径找到alt属性
img_data = requests.get(url=img_src, headers=head).content # 二进制方式保存数据
img_path = './pic_4k/' + img_name # 设置保存路径
with open(img_path, 'wb') as fp: # 创建文件指针
fp.write(img_data) # 保存数据
print(img_name, '下载成功!!!') # 提示语
2.获取58同城二手房信息
import requests # 用于发送请求
from lxml import etree # 运用xpath进行数据解析
url = 'https://km.58.com/ershoufang/' # 目标url
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"
} # 设置UA伪装为火狐流浪器
page_text = requests.get(url=url, headers=head).text # 发送亲贵并以文本形式保存
tree = etree.HTML(page_text) # 运用xpath进行数据解析
div_list = tree.xpath('//div[@class="property"]//h3/text()') # 用xpath方式聚焦数据,@后面跟的是属性值,//表示跳过多个层级,最后获取h3中的文本信息
print(div_list) # 打印
3.爬取全国城市名
import requests # 用于发送请求
from lxml import etree # 用xpath方式进行数据解析
url = 'https://www.aqistudy.cn/historydata/' # 目标url
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"
} # 设置UA伪装为火狐流浪器
page_text = requests.get(url=url, headers=headers).text # 发送请求,并把响应数据存成text格式
tree = etree.HTML(page_text) # 用xpath方式进行数据解析
host_li_list = tree.xpath("//div[@class='bottom']//li") # 用xpath方式聚焦数据,@后面跟的是属性值,//表示跳过多个层级
all_city_name = [] # 用于存城市名
for li in host_li_list:
host_city_name = li.xpath('./a/text()')[0] # 用相对路径找到a标签内的text内容
all_city_name.append(host_city_name) # 加入城市名
print(all_city_name, len(all_city_name)) # 打印