跳转到主要内容

用于抓取URL并将其作为文件下载的库

项目描述

WebMixer

用于抓取URL的库

基本抓取器

所有 webmixer.scrapers.pageswebmixer.scrapers.tags 类都继承自 webmixer.base.BasicScraper,这意味着它们都具有以下属性和函数

属性

  • directory (str): 写入文件的目录
  • color (str): 错误消息的颜色(默认:'rgb(153, 97, 137)')
  • locale (str): 编写错误消息时使用的语言(默认:'en')
    • 注意:必须在 webmixer.messages.MESSAGES 中列出
  • default_ext (str): 提取文件默认使用的扩展名

函数

create_tag(tag)

参数

  • tag (str): 要创建的标签名称(例如 'p')

返回 BeautifulSoup 标签示例

image_tag = create_tag('img')

get_filename(link, default_ext=None)

参数

  • link (str): 已抓取的URL
  • default_ext(可选字符串):如果链接没有扩展名,则使用此扩展名

返回用于提取文件的文件名(字符串)示例

video_filename = get_filename('<url>', default_ext='.mp4')

mark_tag_to_skip(tag)

在后续抓取操作中标记要跳过的标签 参数

  • tag(字符串):要标记的标签

示例

Process img tag here...

mark_tag_to_skip(img)

write_url(link, url=None, default_ext=None, filename=None, directory=None)

下载URL并将其写入zip文件 Args

  • filepath(字符串):本地文件的路径
  • directory(字符串):写入zip文件的目录
  • url(可选字符串):用于处理相对URL的URL
  • default_ext(可选字符串):如果链接没有扩展名,则使用此扩展名
  • filename(可选字符串):写入zip文件的文件名
  • directory(可选字符串):写入zip文件的目录

返回zip文件中的filepath示例

write_url('<link>', url='https://domain.com/', default_ext='.mp4', filename='video', directory='media') # 'media/video.mp4'

write_contents(filename, contents, directory=None)

使用给定的文件名将内容写入zip文件 Args

  • filename(字符串):内容的文件名
  • contents(字节):写入zip文件的内容
  • directory(字符串):写入zip文件的目录

返回zip文件中的filepath示例

write_contents('myfile.pdf', <pdf contents>, directory='docs')  # docs/myfile.pdf

write_file(filepath, directory=None)

将本地文件写入zip文件 Args

  • filepath(字符串):本地文件的路径
  • directory(字符串):写入zip文件的目录

返回zip文件中的filepath示例

write_file('path/to/myfile.mp3', directory='music')  # music/myfile.mp3

create_broken_link_message(link)

生成包含断链消息的标签 Args

  • link(字符串):要复制/粘贴的链接

返回一个div标签,包含一个可以复制并粘贴到浏览器中的链接示例

iframe.replaceWith(create_broken_link_message('<url>'))
# iframe -> <div>copy link...</div>

create_copy_link_message(link, partially_scrapable=False)

生成包含“将链接复制到浏览器”消息的标签 Args

  • link(字符串):要复制/粘贴的链接
  • partially_scrapable(布尔值):链接大部分已抓取,但不包括原始网站的所有内容

返回一个div标签,包含一个可以复制并粘贴到浏览器中的链接示例

iframe.replaceWith(create_copy_link_message('<url>'))
# iframe -> <div>copy link...</div>

异常

webmixer.exceptions可以用于处理来自各种来源的错误。如果您正在抓取更专业的来源,可能存在一些仅针对该来源的异常。然后,您可以引发以下异常以正确管理该来源

BrokenSourceException

当链接完全损坏时使用(例如,网站不再存在)

UnscrapableSourceException

当链接工作但无法在Kolibri上支持时使用(例如,Flash内容)

例如,webmixer.scrapers.pages.gdrive.GoogleDriveScraper可能会抛出FileNotDownloadableError错误。为了正确处理此错误,它将引发UnscrapableSourceException

try:
	...
except FileNotDownloadableError as e:
	raise UnscrapableSourceException(e)

页面抓取器

有几个页面抓取器可用于抓取HTML页面。它们将下载URL到它们各自的文件类型

内置抓取器

以下是基本抓取器类的列表,它们也列在webmixer.scrapers.pages.base.COMMON_SCRAPERS

  • WebVideoScraper
  • PDFScraper
  • EPubScraper
  • ImageScraper
  • FlashScraper
  • VideoScraper
  • AudioScraper

使用页面抓取器

创建抓取器对象时,您可能需要指定以下内容

  • url(字符串):标签可以找到的URL(用于处理相对URL) 必需
  • zipper(可选 ricecooker.utils.html_writer):要写入的zip文件
  • triaged(可选 [str]):已解析的URL列表

要抓取页面,您可以使用以下任何一种写入选项

to_zip:将文件写入self.zipper,这在抓取HTML页面中的嵌入式源时很有用 Args

  • filename(可选字符串):要写入的文件名 返回zip文件中的文件路径

以下是每个webmixer.scrapers.pages.base.Scraper的默认扩展名

抓取器 扩展名
HTMLPageScraper .html
PDFScraper .pdf
EPubScraper .epub
AudioScraper .mp3
VideoScraper .mp4
WebVideoScraper .mp4
ImageScraper .png
FlashScraper error

例如

from webmixer.scrapers.base import ImageScraper
image= <BeautifulSoup tag>
image['src'] = ImageScraper('<url>').to_zip()  # Sets 'src' to zipped image filepath

to_tag:将文件写入zip并基于它是哪种类型的抓取器生成标签。当您用原生的HTML元素替换iframe时很有用 Args

  • filename(可选字符串):要写入的文件名 返回标签

以下是每个webmixer.scrapers.pages.base.Scraper的返回标签类型

抓取器 标签
HTMLPageScraper None
PDFScraper <embed>
EPubScraper None
AudioScraper <audio>
VideoScraper <video>
WebVideoScraper <video>
ImageScraper <img>
FlashScraper error

例如

from webmixer.scrapers.base import PDFScraper
iframe= <BeautifulSoup tag>
iframe.replaceWith(PDFScraper('<url>').to_tag())  # Replaces iframe with <embed> tag

to_file:写入文件。这对于将URL作为文件下载到您的本地计算机很有用 Args

  • filename(可选字符串):要写入的文件名
  • 目录(可选字符串):写入的目录
  • 覆盖(布尔值):如果存在则覆盖文件 返回下载文件的文件路径

to_file使用download_file方法将文件写入write_to_path

以下是每个webmixer.scrapers.pages.base.Scraper的返回文件类型

抓取器 扩展名
HTMLPageScraper .zip - 由ricecooker.utils.html_writer生成
PDFScraper .pdf
EPubScraper .epub
AudioScraper .mp3
VideoScraper .mp4
WebVideoScraper .mp4
ImageScraper 错误 - 不支持的内容类型
FlashScraper error

例如

from webmixer.scrapers.base import HTMLPageScraper
new_html_zip_path = HTMLPageScraper('<url>').to_file() # Returns newly scraped html .zip file

自定义爬虫

鉴于互联网的多样性,您可能需要实现自己的爬虫来处理个别来源。您必须实现一个test类方法才能使用您的爬虫。

如果您想分享一个自定义爬虫,请随时在webmixer.scrapers.pages下创建一个新文件并打开一个pull request。

属性

所有爬虫都具有以下属性

  • dl_directory (字符串):写入to_file下载文件的目录(默认:'downloads')
  • directory (str): 写入文件的目录
  • color (str): 错误消息的颜色(默认:'rgb(153, 97, 137)')
  • locale (str): 编写错误消息时使用的语言(默认:'en')
    • 注意:必须在 webmixer.messages.MESSAGES 中列出
  • default_ext (str): 提取文件默认使用的扩展名
  • kind (le_utils.constants.content_kind):要写入的内容类型

webmixer.scrapers.pages.base.HTMLPageScraper具有以下附加属性

  • partially_scrapable (布尔值):并非所有内容都可以在Kolibri内部查看(默认:False)
  • scrape_subpages (布尔值):确定是否爬取此页面内的任何子页面(默认:True)
  • main_area_selector (可选元组):要替换body标签中所有内容的主体元素选择器
  • omit_list (可选列表):要从不页面内容中删除的选择器列表(例如:[('a', {'class': 'link'})])
  • loadjs (布尔值):确定在加载页面时是否加载js(默认:True)
  • scrapers ([webmixer.scrapers.pages.Scraper]):要在此页面上使用的附加爬虫列表
  • extra_tags ([webmixer.scrapers.tags.Tag]):要爬取的附加标签列表

例如,以下代码将删除链接,爬取维基百科页面,并将所有图片设置为'myimg.png'

from webmixer.scrpaers.tags import ImageTag
from webmixer.scrapers.pages.base import HTMLPageScraper
from webmixer.scrapers.pages.wikipedia import WikipediaScraper

class MyCustomTag(ImageTag):
	def process(self):
		self.tag['src'] = self.write_file('myimg.png')

class MyCustomScraper(HTMLPageScraper):
	omit_list = [('a',)]  		   # Remove links
	extra_tags = [MyCustomTag]     # Use MyCustomTag to set images to 'myimg.png'
	scrapers = [WikipediaScraper]  # Scrape any Wikipedia pages

	@classmethod                   # Required test classmethod
	def test(self, url):
		return 'my-domain.com' in url

函数

@classmethod test(url):必需方法,用于确定此爬虫是否适用于此URL 参数

  • url (字符串):要测试的url 返回 True 如果爬虫适用于爬取URL 示例
@classmethod
def test(self, url):
	return 'somedomain' in url

preprocess(contents):在主爬取方法之前处理内容 参数:contents (BeautifulSoup):要预处理的content 示例

# Delete the first image on the page before scraping all the images
def preprocess(self, contents):
	contents.find('img').decompose()

postprocess(contents):在主爬取方法之后处理内容 参数:contents (BeautifulSoup):要后处理的content 示例

# Append a link at the end of the <body> tag
def postprocess(self, contents):
	link = self.create_tag('a')
	link.string = 'New Link'
	contents.body.append(link)

标签

有几个标签可用于在爬取HTML页面时使用。这些将处理下载任何引用的文件。

使用标签

要创建一个标签,您可以指定以下内容

  • tag (BeautifulSoup.tag):要解析的标签 必需
  • url (字符串):标签可以找到的url(用于处理相对URL) 必需
  • attribute (可选字符串):要查找链接的属性(例如:'src'或'data-src')
  • scrape_subpages (可选布尔值):解析由此标签引用的链接页面(默认:True)
  • extra_scrapers (可选 [webmixer.scrapers.base.BasicScrapers]):要尝试爬取链接页面的爬虫列表
  • color (可选字符串):注入错误消息的颜色(默认:'rgb(153, 97, 137)')

要爬取标签,请使用scrape方法。这将处理标签,使其可以在HTML zip内部使用。以下是一个简单的爬取示例

from webmixer.scrapers.tags import ImageTag
image_tag = <BeautifulSoup.img tag>
image_scraper = ImageTag(image_tag, '<url>')
image_scraper.scrape()  # image_tag['src'] will point to downloaded image file in zip

内置标签

以下是可用标签的列表,这些标签也列在webmixer.scrapers.tags.COMMON_TAGS

  • ImageTag (img)
  • AudioTag (audio)
  • VideoTag (video)
  • EmbedTag (embed)
  • LinkTag (a) 爬取由'href'属性引用的链接页面
  • IframeTag (iframe) 爬取由'on'属性引用的嵌入页面
  • StyleTag (style) 爬取由'href'属性引用的样式表
  • ScriptTag (script) 爬取由'src'属性引用的脚本

自定义标签

根据您要爬取的来源,您可能需要更多特定的方法来爬取页面。要创建自定义标签,您需要从webmixer.scrapers.tags.BasicScraperTag派生子类。

属性

所有标签都具有以下属性

  • 选择器(元组):BeautifulSoup选择器,用于查找标签(例如:('a', {'class': 'link'}))
  • default_ext(字符串):如果链接没有扩展名时使用的扩展名
  • directory(字符串):将标签文件写入的目录
  • attributes(字典):分配给标签的任何属性
  • default_attribute(字符串):引用文件的属性(默认:'src')
  • scrape_subpages(布尔值):确定是否抓取任何链接页面(默认:True)
  • extra_scrapers ([webmixer.scrapers.base.BasicScrapers]):用于抓取链接页面的额外抓取器列表
  • color (str): 错误消息的颜色(默认:'rgb(153, 97, 137)')
  • locale (str): 编写错误消息时使用的语言(默认:'en')
    • 注意:必须在 webmixer.messages.MESSAGES 中列出

示例

from webmixer.scrapers.tags import BasicScraperTag

class MyVideoTag(BasicScraperTag):
	selector = ('video', {'class': 'video-class'})  # Select video.video-class
	directory = 'media'								# Files will be written to media folder
	attributes = {									# Videos will have width 100%
		'width': '100%'
	}

内置函数

对于更自定义的抓取逻辑,您还可以重写以下方法

process():通过下载任何引用的文件,使标签在html zip文件中可使用。示例

class MyVideoTag(BasicScraperTag):
	def process(self):
		# Scrape all of the <source> tags
	    for source in self.tag.find_all('source'):
	        BasicScraperTag(source, self.zipper, self.url).scrape()

handle_error():确定如何处理链接损坏的情况。示例

class MyVideoTag(BasicScraperTag):
	def handle_error(self):
		self.tag.decompose()  # Just remove the element if it doesn't work

handle_unscrapable():确定如何处理不可抓取的链接的情况。示例

class MyVideoTag(BasicScraperTag):
	def handle_unscrapable(self):
		self.tag.replaceWith(self.create_copy_link_message(self.link))

辅助函数

webmixer.utils.guess_scraper

如果您想根据URL确定要使用哪个抓取器,可以使用webmixer.utils.guess_scraper方法。这将接受以下参数

  • url(字符串):要抓取的URL
  • scrapers ([webmixer.scrapers.base.BasicScrapers]):与其他抓取器进行测试的抓取器列表
  • allow_defualt(可选布尔值):如果没有匹配项,则使用通用默认抓取器(默认:False)

您还可以使用kwargs向抓取器传递额外的参数

因此,guess_scraper的简单使用可能如下所示

from webmixer.utils import guess_scraper
scraper = guess_scraper('<url>', scrapers=[MyCustomScraper])

======= 历史

0.0.0 (2019-07-30)

  • 首次发布在PyPI上。

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分布

webmixer-0.0.0.tar.gz (27.9 kB 查看哈希值)

上传时间:

构建分布

webmixer-0.0.0-py3-none-any.whl (30.4 kB 查看哈希值)

上传时间: Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面