用于抓取URL并将其作为文件下载的库
项目描述
WebMixer
用于抓取URL的库
基本抓取器
所有 webmixer.scrapers.pages
和 webmixer.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 | |
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 | |
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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 49e0fb24c93ea74d1e221b491d66d042b6e785fbb5036fc4c493ac213e5f467a |
|
MD5 | 45a9e4125c6796686b315225be197f85 |
|
BLAKE2b-256 | 48bbdee7e7ca81cd28ac4f57e1c54a987281180f0748b42d8b3ed9d524d83f09 |
webmixer-0.0.0-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8bc4f1c57ed4064fce1a4ee4287d4d668720067a8220e31a779761d67be73023 |
|
MD5 | de66b6a9b04b07f5b2cddfea87993fb0 |
|
BLAKE2b-256 | 3673419c91c2bf50fd39a0b87ea0a7a44d4491b0ac6a67b6a27b0f4710eb5861 |