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'])

代码对应输出的结果:

相关推荐
孟健2 小时前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞4 小时前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
曲幽6 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
敏编程11 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪11 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
databook11 小时前
ManimCE v0.20.1 发布:LaTeX 渲染修复与动画稳定性提升
python·动效
花酒锄作田1 天前
使用 pkgutil 实现动态插件系统
python
前端付豪1 天前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽1 天前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战1 天前
Pydantic配置管理最佳实践(一)
python