Парсинг с помощью Scrapy на примере Runion

  • На форуме работает ручное одобрение пользователей. Это значит, что, если Ваша причина регистрации не соответствует тематике форума, а также Вы используете временную почту, Ваша учётная запись будет отклонена без возможности повторной регистрации. В дальнейшем - пожизненная блокировка обоих аккаунтов за создание мультиаккаунта.
  • Мы обновили Tor зеркало до v3!
    Для входа используйте следующий url: darkv3nw2...bzad.onion/
  • Мы вновь вернули telegram чат форуму, вступайте, общайтесь, задавайте любые вопросы как администрации, так и пользователям!
    Ссылка: https://t.me/chat_dark_time

VladikSk

Пользователь

VladikSk

Пользователь
1 Июл 2016
121
76
Scrapy - это специальный фреймворк, предназначенный для удобного и быстрого парсинга в сети интернет, написанный на языке python.

Зачем он нужен, если можно с нуля написать парсер определенных данных под нужный сайт? В целом да можно и с нуля, но изучив данный фреймворк впоследствии вам будет достаточно просто за короткое время парсить любые сайты. Среди возможностей scrapy поддержка куки, пост-запросов, сессий, юзер-агенты, прокси. Скорость работы очень высока, вам не придется выжимать все и придумывать с нуля. Есть готовый рабочий инструмент.


Я расскажу вам, как с ним работать на примере парсинга нашего форума Рунион.

1) Подготовка к работе

Необходимо установить python, я использую версию 2.

Сам scrapy можно установить как с помощью pip - pip install scrapy,
так и с помощью репозиториев вашего дистрибутива(если это линукс).
Например - sudo apt-get install python-scrapy

После этого необходимо создать пустой проект.

scrapy startproject runion

В папке будет несколько стандартных файлов, которые нам придется далее изменить.

2) Кодим

Первый файл, который мы изменим будет items.py
Я добавил туда поля для ящика, даты регистрации юзера и никнейма.

Код:
class RunionItem(Item):
     # define the fields for your item here like:
     # name = Field()
     bah = Field()
     user = Field()
     time = Field()
Далее создадим новый файл для работы с прокси и смены юзер-агентов - middlewares.py

Код:
import random
from scrapy.conf import settings
from scrapy import log

class RandomUserAgentMiddleware(object):
    def process_request(self, request, spider):
        ua = random.choice(settings.get('USER_AGENT_LIST'))
        if ua:
            request.headers.setdefault('User-Agent', ua)
            #this is just to check which user agent is being used for request
            spider.log(
                u'User-Agent: {} {}'.format(request.headers.get('User-Agent'), request),
                level=log.DEBUG
            )

class ProxyMiddleware(object):
    def process_request(self, request, spider):
        request.meta['proxy'] = settings.get('HTTP_PROXY')
Случайно будет браться юзер-агенты и задаваться прокси для запросов.

Для работы через тор мы будем использовать polipo-прокси.
sudo apt-get install polipo

Необходимо убедиться, что в конфиге polipo назначен socks-прокси от вашего тора.
socksParentProxy = "localhost:9050"
socksProxyType = socks5


Перезапустим сервис.
sudo service polipo restart

Изменим файл настроек нашего проекта runion - settings.py

Код:
# Scrapy settings for runion project
#
# For simplicity, this file contains only the most important settings by
# default. All the other settings are documented here:
#
#     http://doc.scrapy.org/topics/settings.html
#

BOT_NAME = 'runion'
BOT_VERSION = '1.0'

SPIDER_MODULES = ['runion.spiders']
NEWSPIDER_MODULE = 'runion.spiders'
USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10"

USER_AGENT_LIST = [
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7',
    'Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0) Gecko/16.0 Firefox/16.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10',
    ]

HTTP_PROXY = 'http://127.0.0.1:8123'

DOWNLOADER_MIDDLEWARES = {
    'runion.middlewares.RandomUserAgentMiddleware': 400,
    'runion.middlewares.ProxyMiddleware': 410,
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
}
Здесь мы включаем переменную для прокси и юзер-агентов, а также показываем scrapy, что есть специальные функции для работы с ними.

Далее переходим в папку spiders. Здесь происходит основная магия.
Создадим файл runion_spider.py

Импортируем основные модули.

Код:
from scrapy.contrib.spiders import CrawlSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.spiders import Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.loader import XPathItemLoader
from runion.items import RunionItem

class Loader(XPathItemLoader):
    pass
И создадим класс паука для парсинга.

Код:
class RunionSpider(CrawlSpider):
    name = "runion"
    allowed_domains = ["lwplxqzvmgu43uff.onion"]
   
    start_urls = ["http://lwplxqzvmgu43uff.onion"]

    rules = (
        Rule(SgmlLinkExtractor(allow=['viewforum\.php']), follow=True),
        Rule(SgmlLinkExtractor(allow=['viewtopic\.php']), callback='parse_item'))

    def parse_item(self, response):
        hxs = HtmlXPathSelector(response)
        items = []
        for i in hxs.select('//*[@id]/div/div[1]'):
            item = RunionItem()

            bah = i.select('div/div[1]/dl/dd[3]/span/text()').extract()
            if bah:
                item['bah'] = bah
                user = i.select('div/div[1]/dl/dt/span/strong/text()').extract()
                time = i.select('div/div[1]/dl/dd[4]/span/text()').extract()
                item['user'] = user
                item['time'] = time
                items.append(item)

        return(items)
Здесь мы задаем домены для парсинга, начальные урлы, далее правила для извлечения ссылок и парсинга и функцию для парсинга. В ней используется технология XPath для извлечения нужной информации. Подробнее погуглите ее логику для понимания.



3) Парсим

Переходим в основную папку проекта.
scrapy scrawl runion
Вы увидете множество чередующихся строчек. И заметите, что скорость парсинга достаточно высока. Правда мы все еще не сохраняем данные.

scrapy crawl runion -o 1.csv -t csv

Теперь вся нужная спарсенная информация будет сохранять в формате csv, который можно открыть excel'em или же опенофис'om.


Пример небольшой части данных.
green9104,> 2014-05-23,
reg001,> ,
Перон12,> ,
Nikkon, ccc55e04903d,> 2014-02-21
reg001,> ,
nickyblackmarket, a709f8fb3fd2,> 2013-05-28
Перон12,> ,
nickyblackmarket, a709f8fb3fd2,> 2013-05-28
Nikkon, ccc55e04903d,> 2014-02-21
reg001,> ,
nickyblackmarket, a709f8fb3fd2,> 2013-05-28
Nikkon, ccc55e04903d,> 2014-02-21
anshlag, 438a5fb3c5ce,> 2014-04-30
Nikkon, ccc55e04903d,> 2014-02-21
nickyblackmarket, a709f8fb3fd2,> 2013-05-28
palevo,> ,
Flowyh,> ,
megamozG,> 2013-06-11,>
Перон12,> ,
reg001,> ,
nickyblackmarket, a709f8fb3fd2,> 2013-05-28

Конечно данные повторяются. Поэтому нужно убрать повторения таким образом.
cat 1.csv | sort | uniq > 2.csv

Теперь данные отсортированы по алфавиту и без дублей.
Отсюда легко с помощью grep'a извлечь отдельные данные например составить список логинов или же ящиков. Логины например можно брутить, по ящикам спамить , но это так просто информация к размышлению.

Разумеется вы можете видоизменить функции, чтобы спарсить статьи например или составить список комментариев, которые оставляли определенные люди.

То же самое можно вполне сделать с другим сайтом - тот же рамп(несмотря на яваскрипт и закрытость), достаточно вручную пройти аутентификацию и скопировать куки, а затем использовать их.
Можно было бы парсить, как джабберы, почты и любую другую более-менее полезную инфу.

Автор: SleepWalker
 

О нас

  • Наше сообщество существует уже много лет и гордится тем, что предлагает непредвзятое, критическое обсуждение различных тем среди людей разных слоев общества. Мы работаем каждый день, чтобы убедиться, что наше сообщество является одним из лучших.

    Dark-Time 2015 - 2024

    При поддержке: XenForo.Info

Быстрая навигация

Меню пользователя