python爬虫案例-聚焦爬虫的数据解析简述

聚焦爬虫是指在拿到一个网页的响应后,对这个网页复杂的信息进行聚焦式的提取,这个提取关键信息的过程往往是爬虫中最核心的部分,我们也把这个提取的过程叫做数据解析,数据解析中最常用的办法有三类,下面结合代码和解析简述一下。

一.正则

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))  # 打印

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Henrik-Yao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值