17.python爬虫基础,基于正则表达式的爬虫,基于BeautifulSoup的爬虫

基于正则表达式的爬虫

一、爬虫简介

1、搜索引擎:百度,谷歌,企业内部的知识库,某些项目专项数据爬取,专业的数据爬取

2、互联网:公网(不需要授权的情况就可以浏览的内容,搜索引擎的重点),深网(需要授权才能使用的内容),暗网(非正式渠道,无法使用常规手段访问)

3、爬取互联网的公开信息,但是正常情况下,也需要遵守一个规则:robots协议。

二、基本原理

1、所有和网页,均是HTML,HTML首先是一个大的字符串,可以按照字符串处理的方式对响应进行解析处理。其次,HTML本身也是一门标记语言,与XML是同宗同源,所以可以使用DOM对其文本进行处理。

2、所有的爬虫,核心基于超链接,进而实现网站和网页的跳转。给我一个网站,爬遍全世界。

3、如果要实现一个整站爬取程序,首先需要收集到站内所有网址,并且将重复网址去除,开始爬取内容并保存在本地或数据库,进行实现后续目标。

三、正则表达式的实现

python 复制代码
import re,requests,time

resp = requests.get('http://192.168.102.136/')
# print(resp.text)

#解析网页中的所有超链接
# links = re.findall('<a href="(.+?)">',resp.text) # 输出的是列表
# for link in links:
#     print(link)

保存网站完整链接和图片的代码如下所示:

python 复制代码
import re,requests,time

resp = requests.get('http://192.168.102.136/')
# print(resp.text)

#解析网页中的所有超链接
# links = re.findall('<a href="(.+?)">',resp.text) # 输出的是列表
# for link in links:
#     print(link)

# 基于一些错误的源内容,对其进行优化,并下载和保存网页
def download_page():
    resp = requests.get('http://192.168.102.136/')
    links = re.findall('<a href="(.+?)"', resp.text) # 输出的是列表
    for link in links:
        # 根据页面特性,将一些无用的信息排除
        if 'articleid' in link:
            continue
        if link.startswith('#'):
            continue
        # 对超链接进行处理,拼接出完整的URL地址
        if link.startswith('/'):
            link = 'http://192.168.102.136' + link
        # print(link)

        # 将页面文件保存与本地
        resp = requests.get(link)
        resp.encoding = 'utf-8'
        filename = link.split('/')[-1] + time.strftime("_%Y%m%d_%H%M%S") + '.html'
        with open(f'./woniunote/page/{filename}',mode='w',encoding='utf-8') as file:
            file.write(resp.text)

# 爬虫首页图片
def download_image():
    resp = requests.get('http://192.168.102.136/')
    images = re.findall('<img src="(.+?)"',resp.text)
    for image in images:
        # print(image)
        # 处理URL地址
        if image.startswith('/'):
            image = 'http://192.168.102.136' + image
        # 下载图片
        resp = requests.get(image)
        # suffix = image.split('.')[-1]
        filename = time.strftime("%Y%m%d_%H%M%S") + image.split('/')[-1]
        with open('./woniunote/image/' + filename,mode='wb') as file:
            file.write(resp.content)

if __name__ == '__main__':
    # download_page()
    download_image()

基于BeautifulSoup的爬虫

一、Beautifulsoup简介

Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,BeautifulSoup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。

Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

BS基于DOM结构进行页面内容解析,当开始解析时,会将整个页面的DOM树保存于内存中,进而实现查找。

解析器:

(1)Python标准库BeautifulSoup(markup,"html.parser")Python的内置标准库、执行速度适中、文档容错能力强

(2)Ixml HTML解析器BeautifulSoup(markup,'Ixml')速度快、文档容错能力强需要安装C语言库

(3) Ixml XML解析器BeautifulSoup(markup, "xml")速度快、唯一支持XML的解析器需要安装C语言库

(4)html5lib BeautifulSoup(markup,"html5lib")最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档速度慢、不依赖外部扩展

二、具体代码使用

python 复制代码
from bs4 import BeautifulSoup
import requests

resp = requests.get('http://192.168.102.136/')

# 初始化解释器
BS = BeautifulSoup(resp.text,'lxml')
# 查找页面元素(根据标签层次进行查找)
# print(BS.head.title)
# print(BS.head.title.string)

# 查找页面元素的通用方法
# 1、find_all:根据标签,属性,XPath等进行查找
# 2、select:css选择器,div,#id,.class

# 查找页面所有超链接
links = BS.find_all('a')
# for link in links:
#     print(link['href'])

# 查找页面所有的图片
images = BS.find_all('img')
# for image in images:
#     print(image['src'])

# 根据id或class等属性查找
'''
keyword = BS.find(id='keyword')
print(keyword)
# 结果:<input class="form-control" id="keyword" onkeyup="doSearch(event)" placeholder="请输入关键字" type="text"/>
print(keyword['placeholder'])
# 结果:请输入关键字
'''

'''
titles = BS.find_all(class_='title')
# print(titles) #以列表形式输出
for title in titles:
    # print(title)
    print(title.find('a'))
    print(title.find('a')['href'])
    print(title.find('a').string)
'''
'''
text = BS.find(string='最新文章')
print(text)
print(text.parent)
print(text.parent.parent)
'''

'''
# 使用xpath格式进行查找//div[@class='title']
titles = BS.find_all('div',{'class':'title'})
print(titles)
for title in titles:
    print(title)
    print(title.string)
'''

# CSS选择器
titles = BS.select('div.title')
print(titles)
for title in titles:
    print(title)
    print(title.string)

keywords = BS.select('#keyword')
print(keywords)
print(keywords[0]['placeholder'])

代码对应输出的结果:

相关推荐
浒畔居7 分钟前
机器学习模型部署:将模型转化为Web API
jvm·数据库·python
抠头专注python环境配置10 分钟前
基于Pytorch ResNet50 的珍稀野生动物识别系统(Python源码 + PyQt5 + 数据集)
pytorch·python
百***787510 分钟前
Kimi K2.5开源模型实战指南:核心能力拆解+一步API接入(Python版,避坑全覆盖)
python·microsoft·开源
喵手12 分钟前
Python爬虫实战:针对天文历法网站(以 TimeandDate 或类似的静态历法页为例),构建高精度二十四节气天文数据采集器(附xlsx导出)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集天文历法网站数据·构建二十四节气天文数据
犀思云31 分钟前
企业端到端NaaS连接的优势与应用
网络·人工智能·机器人·智能仓储·专线
zhaotiannuo_199834 分钟前
Python之2.7.9-3.9.1-3.14.2共存
开发语言·python
Keep_Trying_Go40 分钟前
基于GAN的文生图算法详解ControlGAN(Controllable Text-to-Image Generation)
人工智能·python·深度学习·神经网络·机器学习·生成对抗网络·文生图
Godspeed Zhao1 小时前
现代智能汽车系统——总线技术1
网络·汽车·php
JoySSLLian1 小时前
IP SSL证书:一键解锁IP通信安全,高效抵御网络威胁!
网络·人工智能·网络协议·tcp/ip·ssl
LostSpeed1 小时前
openpnp - python2.7 script - 中文显示乱码,只能显示英文
python·openpnp