基层建设期刊在哪个网站被收录,旅游网站开发意义和价值,上海做网站内容检查的公司,东莞常平二手房价格python对网页进行爬虫
基于BeautifulSoup的爬虫—源码 基于BeautifulSoup的爬虫###?一、BeautifulSoup简介1.?Beautiful?Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱#xff0c;通过解析文档为用户提供…
python对网页进行爬虫
基于BeautifulSoup的爬虫—源码 基于BeautifulSoup的爬虫###?一、BeautifulSoup简介1.?Beautiful?Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱通过解析文档为用户提供需要抓取的数据因为简单所以不需要多少代码就可以写出一个完整的应用程序。
2.?Beautiful?Soup自动将输入文档转换为Unicode编码输出文档转换为utf-8编码。你不需要考虑编码方式除非文档没有指定一个编码方式这时Beautiful
3.?Soup就不能自动识别编码方式了。然后你仅仅需要说明一下原始编码方式就可以了。
4.?Beautiful?Soup已成为和lxml、html6lib一样出色的python解释器为用户灵活地提供不同的解析策略或强劲的速度。
5.?BS基于DOM结构进行页面内容解析当开始解析时会将整个页面的DOM树保存于内存中进而实现查找。
解析器
1.?Python标准库?BeautifulSoup(markup,?html.parser)?-?Python的内置标准库执行速度适中文档容错能力强
2.?lxml?HTML解析器?BeautifulSoup(markup,?lxml)?-?速度快文档容错能力强需要安装C语言库
3.?lxml?XML解析器?BeautifulSoup(markup,?xml)?-?速度快唯一支持XML的解析器需要安装C语言库
4.?html5lib?BeautifulSoup(markup,?html5lib)?-?最好的容错性以浏览器的方式解析文档生成HTML5格式的文档速度慢不依赖外部扩展###?二、具体代码使用from?bs4?import?BeautifulSoup
import?requestsresp??requests.get(https://www.cnblogs.com/leyinsec)#?初始化解析器
html??BeautifulSoup(resp.text,?lxml)#?查找页面元素,根据标签层次进行查找
#?print(html.head.title)
#?print(html.head.title.string)
#?print(html.div)
#?print(html.div.div)
#?查找页面元素的通用方法find_all,select#?查找页面所有超链接
def?html_href():
????links??html.find_all(a)
????for?link?in?links:
????????try:
????????????print(link[href])
????????except?KeyError:
????????????print(No?href?attribute?found?for?this?tag)#?查找页面图片
def?html_images():
????images??html.find_all(img)
????for?image?in?images:
????????print(image[src])
#?根据id或calss等属性查找
keyword??html.find_all(idkeyword)
print(keyword)
print(keyword[placeholder])#?根据title查找
titles??html.find_all(class_title)
for?title?in?titles:
????print(title)
????print(title.find(a))#?根据text查找
title??html.find(textleyinsec)
print(title.parent)#?根据xpath的风格进行查找?//[classtitle?and/or?id1]
titles??html.find_all(div,?{class:?title})
for?title?in?titles:
????print(title)
????
#?css选择器
titles??html.select(div.title)
for?title?in?titles:
????print(title)
????
#?css选择器查找id
keyword??html.select(#keyword)
try:
????print(keyword[placeholder])
except?TypeError:
????print(No?keyword?attribute?found?for?this?tag)#?列表查找
lis??html.select(ul?li)
print(lis)
if?__name__??__main__:
????html_images()基于BeautifulSoup的爬虫—源码解析
这段代码是一个基于BeautifulSoup库的简单爬虫示例用于从指定的网页中提取超链接和图片链接。下面是对代码的详细分析
导入库
from?bs4?import?BeautifulSoup
import?requests这两行代码导入了编写爬虫所需的两个库BeautifulSoup用于解析HTML文档requests用于发送HTTP请求。
发送HTTP请求
resp??requests.get(https://www.cnblogs.com/leyinsec)这行代码使用requests库向指定的URL发送GET请求并将响应存储在变量resp中。
解析HTML文档
html??BeautifulSoup(resp.text,?lxml)这行代码使用BeautifulSoup解析HTTP响应中的文本内容。这里使用了’lxml’作为解析器因为它通常比Python内置的解析器更快且具有更好的容错性。
定义查找页面元素的函数
查找所有超链接
def?html_href():
????links??html.find_all(a)
????for?link?in?links:
????????try:
????????????print(link[href])
????????except?KeyError:
????????????print(No?href?attribute?found?for?this?tag)这个函数查找HTML文档中所有的a标签并尝试打印出每个链接的href属性。如果某个a标签没有href属性则会捕获KeyError异常并打印一条消息。
查找所有图片
def?html_images():
????images??html.find_all(img)
????for?image?in?images:
????????print(image[src])这个函数查找HTML文档中所有的img标签并打印出每个图片的src属性。
根据属性查找元素
keyword??html.find_all(idkeyword)
print(keyword)
print(keyword[placeholder])这段代码尝试查找具有特定id属性的元素并打印出该元素及其placeholder属性。但是这里有一个错误keyword是一个列表所以不能直接使用keyword[placeholder]。应该遍历列表并分别访问每个元素的属性。
根据类名查找元素
titles??html.find_all(class_title)
for?title?in?titles:
????print(title)
????print(title.find(a))这段代码查找所有具有title类的元素并打印出这些元素及其内部包含的a标签。
根据文本查找元素
title??html.find(textleyinsec)
print(title.parent)这段代码查找文本内容为leyinsec的元素并打印出该元素的父元素。
使用CSS选择器查找元素
titles??html.select(div.title)
for?title?in?titles:
????print(title)这段代码使用CSS选择器语法查找所有具有title类的div元素并打印它们。
查找具有特定ID的元素
keyword??html.select(#keyword)
try:
????print(keyword[placeholder])
except?TypeError:
????print(No?keyword?attribute?found?for?this?tag)这段代码试图查找具有特定ID的元素并打印其placeholder属性。但是这里同样有一个错误keyword是一个列表所以不能直接使用keyword[placeholder]。应该遍历列表并分别访问每个元素的属性。
列表查找
lis??html.select(ul?li)
print(lis)这段代码查找所有在ul标签内的li元素并打印出这个列表。
主函数调用
if?__name__??__main__:
????html_images()这段代码确保当脚本作为主程序运行时调用html_images()函数来执行图片链接的查找和打印。
总结
这段代码展示了如何使用BeautifulSoup库来解析HTML文档并通过不同的方法查找和提取页面元素。需要注意的是代码中有一些错误需要修正特别是在处理查找结果为列表的情况时。此外代码中没有处理网络请求可能出现的异常例如连接错误或HTTP错误状态码。在实际应用中应该添加适当的异常处理来提高代码的健壮性。
基于正则表达式的爬虫—源码 基于正则表达式的爬虫以下是提取的文章内容###?一、爬虫简介1.?**搜索引擎**百度谷歌企业内部的知识库某些项目专项数据爬取专业的数据爬取。
2.?**互联网**
???-?公网不需要授权的情况就可以浏览的内容搜索引擎的重点
???-?深网需要授权才能使用的内容
???-?暗网非正式渠道无法使用常规手段访问
3.?**爬取互联网的公开信息**但是正常情况下也需要遵守一个规则robots协议[https://www.baidu.com/robots.txt](https://www.baidu.com/robots.txt)君子协议###?二、基本原理1.?**所有和网页均是HTML**
???-?HTML首先是一个大的字符串可以按照字符串处理的方式对响应进行解析处理。
???-?其次HTML本身也是一门标记语言与XML是同宗同源所以可以使用DOM对其文本进行处理。
2.?**所有的爬虫核心基于超链接**进而实现网站和网页的跳转。给我一个网站爬遍全世界。
3.?**如果要实现一个整站爬取**首先要收集到站内所有网址并且将重复网址去重开始爬取内容并保存在本地数据库进行实现后续目标。
###?三、正则表达式实现import?re
import?timeimport?requestsdef?download_page():
????resp??requests.get(https://www.cnblogs.com/leyinsec)
????#?解析网页所有超链接
????links??re.findall(a?href(.?),?resp.text)
????for?link?in?links:
????????#?排除无用链接
????????if?postid?in?link?or?archive?in?link:
????????????continue
????????elif?link.startswith(javascript):
????????????continue
????????#?将页面文件保存在本地
????????resp??requests.get(link)
????????resp.encoding??utf-8
????????filename??link.split(/)[-1]??time.strftime(_%Y%m%d_%H%M%S)??.html
????????with?open(fpage/leyinsec博客园/{filename},?w,?encodingutf-8)?as?file:
????????????file.write(resp.text)def?download_images():
????resp??requests.get(https://www.cnblogs.com/leyinsec)
????images??re.findall(img?src(.?),?resp.text)
????for?image?in?images:
????????if?image.startswith(/):
????????????image??https://www.cnblogs.com/leyinsec??image
????#?下载图片
????????resp??requests.get(image)
????????filename??time.strftime(_%Y%m%d_%H%M%S)??image.split(/)[-1]
????????with?open(page/leyinsec博客园/photos/??filename,?wb)?as?file:
????????????file.write(resp.content)if?__name__??__main__:
????download_page()
????download_images()基于正则表达式的爬虫—源码解析
这段代码是一个简单的基于正则表达式的爬虫用于从指定的网页中提取超链接和图片链接并将它们保存到本地文件系统中。下面是对代码的详细分析
导入库
import?re
import?time
import?requests这三行代码导入了编写爬虫所需的三个库re用于处理正则表达式time用于处理时间相关的功能requests用于发送HTTP请求。
下载网页内容的函数
def?download_page():
????resp??requests.get(https://www.cnblogs.com/leyinsec)
????#?解析网页所有超链接
????links??re.findall(a?href(.?),?resp.text)
????for?link?in?links:
????????#?排除无用链接
????????if?postid?in?link?or?archive?in?link:
????????????continue
????????elif?link.startswith(javascript):
????????????continue
????????#?将页面文件保存在本地
????????resp??requests.get(link)
????????resp.encoding??utf-8
????????filename??link.split(/)[-1]??time.strftime(_%Y%m%d_%H%M%S)??.html
????????with?open(fpage/leyin?sec博客园/{filename},?w,?encodingutf-8)?as?file:
????????????file.write(resp.text)这个函数首先发送一个GET请求到指定的URL然后使用正则表达式查找所有的超链接。对于每个找到的链接它会检查链接是否包含特定的字符串如’postid’或’archive’或者是否以’javascript’开头如果是则跳过该链接。对于其他链接它会发送另一个GET请求以获取网页内容并将其保存到本地文件系统中文件名包含时间戳以确保唯一性。
下载图片的函数
def?download_images():
????resp??requests.get(https://www.cnblogs.com/leyinsec)
????images??re.findall(img?src(.?),?resp.text)
????for?image?in?images:
????????if?image.startswith(/):
????????????image??https://www.cnblogs.com/leyinsec??image
????#?下载图片
????????resp??requests.get(image)
????????filename??time.strftime(_%Y%m%d_%H%M%S)??image.split(/)[-1]
????????with?open(page/leyinsec博客园/photos/??filename,?wb)?for?file:
????????????file.write(resp.content)这个函数的工作方式与download_page函数类似但是它查找的是img标签中的src属性。对于每个找到的图片链接如果链接是相对路径以’/开头它会将其转换为绝对路径。然后它会发送GET请求以下载图片并将其保存到本地文件系统中文件名同样包含时间戳。
主函数调用
if?__name__??__main__:
????download_page()
????download_images()这段代码确保当脚本作为主程序运行时调用download_page()和download_images()函数来执行网页内容和图片的下载。
注意事项和潜在问题 硬编码的URL代码中硬编码了要爬取的网站URL这限制了脚本的通用性。 缺乏异常处理代码中没有处理网络请求可能出现的异常例如连接错误或HTTP错误状态码。 缺乏robots.txt检查代码没有检查目标网站的robots.txt文件这可能会违反网站的爬虫政策。 文件路径错误在download_page函数中文件路径字符串有一个小错误leyin?sec应该是leyinsec。 重复下载代码没有实现去重逻辑可能会下载重复的网页或图片。 编码问题代码假设所有网页和图片都可以使用UTF-8编码这可能不总是正确的。 性能问题对于大型网站这种简单的递归下载方法可能会导致大量的并发请求从而对目标服务器造成压力。
总结
这段代码展示了如何使用正则表达式和requests库来爬取网页内容和图片并将它们保存到本地。然而代码中存在一些问题和潜在的改进空间特别是在异常处理、遵守robots.txt规则、错误处理和性能方面。在实际应用中应该考虑这些问题并采取相应的措施来提高代码的健壮性和效率。