Scrapy - это специальный фреймворк, предназначенный для удобного и быстрого парсинга в сети интернет, написанный на языке python.
Зачем он нужен, если можно с нуля написать парсер определенных данных под нужный сайт? В целом да можно и с нуля, но изучив данный фреймворк впоследствии вам будет достаточно просто за короткое время парсить любые сайты. Среди возможностей scrapy поддержка куки, пост-запросов, сессий, юзер-агенты, прокси. Скорость работы очень высока, вам не придется выжимать все и придумывать с нуля. Есть готовый рабочий инструмент.
Я расскажу вам, как с ним работать на примере парсинга нашего форума Рунион.
1) Подготовка к работе
Необходимо установить python, я использую версию 2.
Сам scrapy можно установить как с помощью pip - pip install scrapy,
так и с помощью репозиториев вашего дистрибутива(если это линукс).
Например - sudo apt-get install python-scrapy
После этого необходимо создать пустой проект.
scrapy startproject runion
В папке будет несколько стандартных файлов, которые нам придется далее изменить.
2) Кодим
Первый файл, который мы изменим будет items.py
Я добавил туда поля для ящика, даты регистрации юзера и никнейма.
Далее создадим новый файл для работы с прокси и смены юзер-агентов - middlewares.py
Случайно будет браться юзер-агенты и задаваться прокси для запросов.
Для работы через тор мы будем использовать polipo-прокси.
sudo apt-get install polipo
Необходимо убедиться, что в конфиге polipo назначен socks-прокси от вашего тора.
socksParentProxy = "localhost:9050"
socksProxyType = socks5
Перезапустим сервис.
sudo service polipo restart
Изменим файл настроек нашего проекта runion - settings.py
Здесь мы включаем переменную для прокси и юзер-агентов, а также показываем scrapy, что есть специальные функции для работы с ними.
Далее переходим в папку spiders. Здесь происходит основная магия.
Создадим файл runion_spider.py
Импортируем основные модули.
И создадим класс паука для парсинга.
Здесь мы задаем домены для парсинга, начальные урлы, далее правила для извлечения ссылок и парсинга и функцию для парсинга. В ней используется технология XPath для извлечения нужной информации. Подробнее погуглите ее логику для понимания.
3) Парсим
Переходим в основную папку проекта.
scrapy scrawl runion
Вы увидете множество чередующихся строчек. И заметите, что скорость парсинга достаточно высока. Правда мы все еще не сохраняем данные.
scrapy crawl runion -o 1.csv -t csv
Теперь вся нужная спарсенная информация будет сохранять в формате csv, который можно открыть excel'em или же опенофис'om.
Пример небольшой части данных.
Конечно данные повторяются. Поэтому нужно убрать повторения таким образом.
cat 1.csv | sort | uniq > 2.csv
Теперь данные отсортированы по алфавиту и без дублей.
Отсюда легко с помощью grep'a извлечь отдельные данные например составить список логинов или же ящиков. Логины например можно брутить, по ящикам спамить , но это так просто информация к размышлению.
Разумеется вы можете видоизменить функции, чтобы спарсить статьи например или составить список комментариев, которые оставляли определенные люди.
То же самое можно вполне сделать с другим сайтом - тот же рамп(несмотря на яваскрипт и закрытость), достаточно вручную пройти аутентификацию и скопировать куки, а затем использовать их.
Можно было бы парсить, как джабберы, почты и любую другую более-менее полезную инфу.
Автор: SleepWalker
Зачем он нужен, если можно с нуля написать парсер определенных данных под нужный сайт? В целом да можно и с нуля, но изучив данный фреймворк впоследствии вам будет достаточно просто за короткое время парсить любые сайты. Среди возможностей 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()
Код:
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,
}
Далее переходим в папку 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)
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
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