一个轻量级的网络爬虫框架。
项目描述
莫西
概述
Mocy 是一个简单的网络爬虫框架,灵活易用。
-
并发下载
-
装饰器如
@before_download
,@after_download
,@pipe
-
速率限制和重试机制
-
会话保持
-
更多的...
安装
$ pip install mocy
一个简单的例子
下面是一个简单的爬虫来提取即将到来的 Python 事件。
from mocy import Spider, Request, pipe
class SimpleSpider(Spider):
entry = 'https://www.python.org/'
def parse(self, res):
for link in res.select('.event-widget li a'):
yield Request(
link['href'],
state={'name': link.text},
callback=self.parse_detail_page
)
def parse_detail_page(self, res):
date = ' '.join(res.select('.single-event-date')[0].stripped_strings)
yield res.state['name'], date
@pipe
def output(self, item):
print(f'{item[0]} will be held on "{item[1]}"')
SimpleSpider().start()
结果是:
[2021-06-08 00:59:22] INFO : Spider is running...
[2021-06-08 00:59:23] INFO : "GET https://www.python.org/" 200 0.27s
[2021-06-08 00:59:23] INFO : "GET https://www.python.org/events/python-events/1094/" 200 0.61s
[2021-06-08 00:59:23] INFO : "GET https://www.python.org/events/python-events/964/" 200 0.63s
[2021-06-08 00:59:23] INFO : "GET https://www.python.org/events/python-events/1036/" 200 0.69s
[2021-06-08 00:59:23] INFO : "GET https://www.python.org/events/python-events/1085/" 200 0.69s
[2021-06-08 00:59:24] INFO : "GET https://www.python.org/events/python-events/833/" 200 0.79s
[2021-06-08 00:59:24] INFO : Spider exited; total running time 1.12s.
PyFest will be held on "From 16 June through 18 June, 2021"
EuroPython 2021 will be held on "From 26 July through 01 Aug., 2021"
PyCon Namibia 2021 will be held on "From 18 June through 19 June, 2021"
PyOhio 2021 will be held on "31 July, 2021"
SciPy 2021 will be held on "From 12 July through 18 July, 2021"
/examples 目录中有一些详细的示例。
API
要求
class Request(url: str,
method: str = 'GET',
callback: Optional[Callable] = None,
session: Union[bool, dict] = False,
state: Optional[dict] = None,
headers: Optional[dict] = None,
cookies: Optional[dict] = None,
params: Optional[dict] = None,
data: Optional[dict] = None,
json: Optional[dict] = None,
files: Optional[dict] = None,
proxies: Optional[dict] = None,
verify: bool = True,
timeout: Optional[Union[Tuple[Number, Number], Number]] = None,
**kwargs)
流行的 HTTP 库请求在后台使用。请参阅其文档:requests.request。
它接受一些额外的参数:
参数:
- 回调:它将用于处理对此请求的响应。默认值为
self.parse
。 - session:它提供 cookie 持久性、连接池和配置。它可以是
Bool
或dict
。默认值为False
,这意味着不会创建新的 requests.Session。- 如果设置为
True
,则创建requests.Session对象,后续请求将在同一会话下发送。 - 如果设置为 a
dict
,除上述之外,该值还可用于向Request
. 例如:session={'auth': ('user', 'pass'), 'headers': {'x-test': 'true'}}
。
- 如果设置为
- state:在请求和相应的响应之间共享。
回复
该对象包含服务器对 HTTP 请求的响应。实际上它与requests.Response是同一个对象。
该对象附加了几个属性和方法:
属性:
- 请求:
Request
对象。 - state:由 a 传递的同一对象
Request
。
方法:
-
select(self, selector: str, **kw) -> List[bs4.element.Tag]
对 HTML 元素执行 CSS 选择操作。使用了强大的 HTML 解析器Beautiful Soup。
蜘蛛
蜘蛛的基类。所有蜘蛛都必须继承自这个类。
类属性:
-
工作人员
默认:
os.cpu_count() * 2
下载器将执行的并发请求数。
-
暂停:
默认:
30
下载程序在超时前等待的时间量(以秒为单位)。
-
DOWNLOAD_DELAY
默认:
0
下载程序在下载前应等待的时间量(以秒为单位)。
-
RANDOM_DOWNLOAD_DELAY
默认:
True
如果启用,下载器将在下载下一页之前等待随机时间(默认为 0.5 * 延迟 ~ 1.5 * 延迟)。
-
重试_次
默认:
3
遇到连接问题或意外状态代码时重试的最大次数。
-
重试代码:
默认:
(500, 502, 503, 504, 408, 429)
要重试的 HTTP 响应状态代码。总是重试其他错误(DNS 或连接问题)。
502:错误网关,503:服务不可用,504:网关超时,408:请求超时,429:请求过多。
-
重试延迟
默认:
1
下载程序在重试失败请求之前将等待的时间量(以秒为单位)。
-
DEFAULT_HEADERS
默认:
{'User-Agent': 'mocy/0.1'}
属性:
entry: Union[str, Request, Iterable[Union[str, Request]], Callable] = []
方法:
-
entry() -> Union[str, Request, Iterable[Union[str, Request]], Callable] = []
-
on_start(self) -> None
当蜘蛛启动时调用。
-
on_finish(self) -> None
当蜘蛛退出时调用。
-
on_error(self, reason: SpiderError) -> None
当蜘蛛在下载或解析时遇到错误时调用。它可能被多次调用。
-
parse(self, res: Response) -> Any
解析响应并生成一些数据或新请求。
-
collect(self, item: Any) -> Any
当蜘蛛输出结果时调用。通常它会被调用多次。
-
collect(self, item: Any, res: Response) -> Any
当蜘蛛输出结果时调用。通常它会被调用多次。
-
start(self) -> None
启动蜘蛛。它将继续运行,直到处理完所有请求。
装饰器
装饰器可以应用于Spider
类的多个方法。它们的调用顺序与定义的顺序相同。
-
before_download
装饰方法用于修改请求对象。如果它没有返回相同或新的
Request
对象,则传递的请求将被忽略。 -
after_download
装饰方法用于修改响应对象。如果它没有返回相同的或新的
Response
对象,则传递的响应将被忽略。如果它返回一个Request
对象,那么该对象将被添加到请求队列中。 -
pipe
装饰方法用于处理已生成的项目。如果它返回
None
,则该项目将不会传递到下一个管道。Spider.collect
是默认管道。
例外
-
class SpiderError(msg: str, cause: Optional[Exception] = None)
蜘蛛错误的基类。以下异常继承自此类。
属性:
- msg:解释发生了什么的简短文本。
- 原因:引发此错误的基础异常。
- 请求:
Request
对象。 - res:
Response
对象;它可能是None
。
-
class RequestIgnored(url: str, cause: Optional[Exception] = None)
表示已决定不处理请求。
-
class ResponseIgnored(url: str, cause: Optional[Exception] = None)
表示已决定不处理响应。
-
class DownLoadError(url: str, cause: Optional[Exception] = None)
表示下载时出错。
-
class ParseError(url: str, cause: Optional[Exception] = None)
表示解析时出错。
测试
$ pytest
执照
麻省理工学院
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。