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

代码对应输出的结果:

相关推荐
寻星探路12 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
王达舒199412 小时前
HTTP vs HTTPS: 终极解析,保护你的数据究竟有多重要?
网络协议·http·https
朱皮皮呀12 小时前
HTTPS的工作过程
网络协议·http·https
Binary-Jeff12 小时前
一文读懂 HTTPS 协议及其工作流程
网络协议·web安全·http·https
ValhallaCoder14 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
盟接之桥15 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
猫头虎15 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
会员源码网15 小时前
理财源码开发:单语言深耕还是多语言融合?看完这篇不踩坑
网络·个人开发
少云清15 小时前
【金融项目实战】9_接口测试 _BeautifulSoup基本使用
beautifulsoup·接口测试·金融项目实战
八零后琐话15 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python