coding utf-8 Developed by Arseniy Sluchevskiy arseniy sluchevskiy gmai

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# -*- coding: utf-8 -*-
"""
Developed by Arseniy Sluchevskiy <arseniy.sluchevskiy@gmail.com>
"""
import logging
import pymongo
from grab.spider import Spider, Task
from grab import DataNotFound
class B2bSpider(Spider):
def prepare(self):
self.load_proxylist('./ru_proxy_socks.list', source_type='text_file', proxy_type='socks5')
self.db = pymongo.Connection()['b2b']
self.setup_cache(backend='mongo', database='b2b')
categories = {
'http://b2b-russia.ru/rubricator/company/9/24/0/1/MA==,MTAwMDAwMDA=,MA==': {},
'http://b2b-russia.ru/rubricator/company/18/51/0/1/MA==,MTAwMDAwMDA=,MA==': {
u'БЕЗЛИМИТНЫЙ ИНТЕРНЕТ, БЕСПРОВОДНОЙ ИНТЕРНЕТ, ИНТЕРНЕТ — ПРОВАЙДЕРЫ',
u'ИНФОРМАЦИОННАЯ БЕЗОПАСНОСТЬ — ПРОИЗВОДСТВО, ПРОДАЖА ОБОРУДОВАНИЯ, УСЛУГИ',
u'ПЕЙДЖИНГОВАЯ СВЯЗЬ — ОПЕРАТОРЫ',
u'СОТОВАЯ СВЯЗЬ — ОПЕРАТОРЫ',
u'ТЕЛЕФОННАЯ СВЯЗЬ, IP-ТЕЛЕФОНИЯ, SIP-ТЕЛЕФОНИЯ — УСЛУГИ',
},
'http://b2b-russia.ru/rubricator/company/2/3/0/1/MA==,MTAwMDAwMDA=,MA==': {
u'ГРУЗОПЕРЕВОЗКИ АВТОМОБИЛЬНЫМ ТРАНСПОРТОМ',
u'ГРУЗОПЕРЕВОЗКИ ВОЗДУШНЫМ ТРАНСПОРТОМ, АВИАПЕРЕВОЗЧИКИ',
u'ГРУЗОПЕРЕВОЗКИ ЖЕЛЕЗНОДОРОЖНЫМ ТРАНСПОРТОМ',
u'ЛОГИСТИКА, УПРАВЛЕНИЕ ЦЕЛЯМИ ПОСТАВОК',
u'ПЕРЕВОЗКА ГРУЗОВ В КОНТЕЙНЕРАХ',
u'ПЕРЕВОЗКА ГРУЗОВ ВОДНЫМ ТРАНСПОРТОМ',
u'ПЕРЕВОЗКА ТЕХНИКИ, ТРАНСПОРТИРОВКА АВТОМОБИЛЕЙ, ПЕРЕВОЗКА НЕГАБАРИТНЫХ, ТЯЖЕЛОВЕСНЫХ ГРУЗОВ',
u'ТРАНСПОРТНО-ЭКСПЕДИТОРСКИЕ КОМПАНИИ, ЭКСПЕДИРОВАНИЕ ГРУЗОВ',
u'СКЛАДСКИЕ УСЛУГИ, СКЛАДСКИЕ ПОМЕЩЕНИЯ, АРЕНДА СКЛАДОВ, ОТВЕТСТВЕННОЕ ХРАНЕНИЕ',
},
'http://b2b-russia.ru/rubricator/company/8/15/0/1/MA==,MTAwMDAwMDA=,MA==': {},
'http://b2b-russia.ru/rubricator/company/11/22/0/1/MA==,MTAwMDAwMDA=,MA==': {
u'АУДИО- И ВИДЕОТЕХНИКА — ОПТОВАЯ ПРОДАЖА',
},
'http://b2b-russia.ru/rubricator/company/7/43/0/1/MA==,MTAwMDAwMDA=,MA==': {
u'ПРОДУКТЫ ПИТАНИЯ — ОПТОВАЯ ПРОДАЖА',
}
}
def task_generator(self):
for key in self.categories:
yield Task('initial', key)
def task_initial(self, grab, task):
for a in grab.doc.select('//div[@class="rubrikator_bottom"]//li/a'):
if a.text() in self.categories[task.url] or not self.categories[task.url]:
yield Task('list', a.attr('href'))
def task_list(self, grab, task):
if grab.response.code == 404:
return
try:
page = task.page
except Exception:
page = 1
category = grab.doc.select('//h1[@class="rubr_level2"]').text()
for div in grab.doc.select('//div[contains(@class, "company_profile")]'):
url = grab.make_url_absolute(div.select('.//h3/a').attr('href'))
name = div.select('.//h3').text()
phone = div.select('.//p[@class="phone"]').text().replace(u'Тел.:', '').strip()
try:
email = div.select('.//a[@title="E-mail"]').attr('href').replace('mailto:', '').lower()
except DataNotFound:
email = None
try:
category = div.select('.//div[@class="groups"]//li').text()
except Exception, e:
category = category
self.db.item.update({'url': url},
dict(url=url, name=name, phone=phone, email=email, category=category), True)
next_page = page+1
next_url = task.url.replace('/%s/MA' % page, '/%s/MA' % next_page)
yield Task('list', next_url, page=next_page)
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
B2bSpider(thread_number=16).run()