简易多线刮网器
mt-scraper的Python项目详细描述
多线程刮刀
你好,欢迎光临。这是用于python版本3的mt_scraper库文档。
说明
这是一个多线程站点刮板的项目。多线程操作可以多次加快从web上收集数据的速度(在一台普通的旧笔记本电脑上超过10次)。要使用它,您需要根据需要重新定义parse方法,并享受多线程的好处(以及它在python中的所有实现)
在json文件中收集数据,该文件存储包含所收集数据的对象(字典)列表。
应用程序
简单应用
主库使用场景
import mt_scraper
scraper = mt_scraper.Scraper ()
scraper.run ()
import mt_scraper
scraper = mt_scraper.Scraper ()
scraper.run ()
如您所见,只有三行代码
发生这种情况时会发生什么
使用此应用程序,您可以从列表的页面获得数据刮板:
url_components_list = [
'http://example.com/',
'http://scraper.iamengineer.ru',
'http://scraper.iamengineer.ru/bad-file.php',
'http://badlink-for-scarper.ru',
]
添加最后两个页面是为了演示从Internet检索数据时最常见的两个错误:http 404-not found和url error:name:或service not known。
将此列表替换为模板即可获得真正的url:
url_template = '{}'
数据累积在文件中:
out_filename = 'out.json'
该工作在5个线程中执行,并创建一个5个单元的任务队列(该队列具有一个值,例如,当从键盘取消操作时,队列长度指示发送了多少任务供执行):
threads_num = 5
queue_len = 5
以下函数用作解析器:
def parse (self, num, url_component, html):
'''You must override this method.
Must return a dictionary or None if parsing the page
impossible
'''
parser = MyDummyHTMLParser ()
parser.feed (html)
obj = parser.obj
obj ['url_component'] = url_component
return parser.obj
dummyparser是html解析器的一个简单版本,它之所以引人注目,是因为它只使用一个标准库,不需要任何额外的模块。 文件dummy_parser.py:
from html.parser import HTMLParser
class MyDummyHTMLParser (HTMLParser):
def __init __ (self):
super () .__ init __ ()
self.a_tag = False
self.h1_tag = False
self.p_tag = False
self.obj = {}
def handle_starttag (self, tag, attrs):
if tag == 'h1':
self.h1_tag = True
elif tag == 'p':
self.p_tag = True
elif tag == 'a':
self.a_tag = True
for (attr, value,) in attrs:
if attr == 'href':
self.obj ['link'] = value
def handle_endtag (self, tag):
if tag == 'h1':
self.h1_tag = False
elif tag == 'p':
self.p_tag = False
elif tag == 'a':
self.a_tag = False
def handle_data (self, data):
if self.h1_tag:
self.obj ['header'] = data
elif self.p_tag and not self.a_tag:
self.obj ['article'] = data
此方法仅用于演示多线程的功能,在实际项目中,建议使用lxml或bs库,下面的“高级应用程序”部分将显示更高级的应用程序