简易多线刮网器

mt-scraper的Python项目详细描述


多线程刮刀

你好,欢迎光临。这是用于python版本3的mt_scraper库文档。

说明

这是一个多线程站点刮板的项目。多线程操作可以多次加快从web上收集数据的速度(在一台普通的旧笔记本电脑上超过10次)。要使用它,您需要根据需要重新定义parse方法,并享受多线程的好处(以及它在python中的所有实现)

在json文件中收集数据,该文件存储包含所收集数据的对象(字典)列表。

应用程序

简单应用

主库使用场景
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库,下面的“高级应用程序”部分将显示更高级的应用程序

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
安卓在Java中将字符串连接到“集合”   java在自己的模块上为每个模块运行spring boot单元测试   java如何在不调用join或get的情况下将Collection<CompletableFuture<X>>转换为CompletableFuture<Collection<X>>?   java折叠工具栏布局在滚动时不折叠   java JPA组合主键/外键映射   java如何使用Apache Velocity模板生成自动关闭的XML元素(如果值为null或空)   Java在2D数组中存储输入文件中的数字   java JPA:如何建模映射<String,设置<Object>>(嵌套集合)   用于使用Java查找字符串的windows MapReduce   java将多个方法组合成一个通用方法   java Micronaut嵌套Json输入验证   java在方法中使用类变量   jar构建Java应用程序   JDBC上的java缓存数据   java Play 2.5。x没有绑定到此线程的EntityManager   java密码。getBlockSize()返回128位,即使使用256位密钥也是如此   java如何在Android上显示可用通知声音列表   Java JNI调用的数组开销   java在创建映射和基于特定键获取值时执行HashMap、LinkedHashMap和ConcurrentHashMap的成本