Соскребание нескольких сайтов одним пауком с помощью Scrapy
Я использую Scrapy для очистки данных с этого сайта. Ниже приведен код для паука.
class StackItem(scrapy.Item):
def __setitem__(self, key, value):
if key not in self.fields:
self.fields[key] = scrapy.Field()
self._values[key] = value
class betaSpider(CrawlSpider):
name = "betaSpider"
def __init__(self, *args, **kwargs):
super(betaSpider, self).__init__(*args, **kwargs)
self.start_urls = [kwargs.get('start_url')]
rules = (Rule (LinkExtractor(unique=True, allow=('.*\?id1=.*',),restrict_xpaths=('//a[@class="prevNext next"]',)), callback="parse_items", follow= True),)
def parse_items(self, response):
hxs = HtmlXPathSelector(response)
posts = hxs.select("//article[@class='classified']")
items = []
for post in posts:
item = StackItem()
item["job_role"] = post.select("div[@class='uu mb2px']/a/strong/text()").extract()
item["company"] = post.select("p[1]/text()").extract()
item["location"] = post.select("p[@class='mb5px b red']/text()").extract()
item["desc"] = post.select("details[@class='aj mb10px']/text()").extract()
item["read_more"] = post.select("div[@class='uu mb2px']/a/@href").extract()
items.append(item)
for item in items:
yield item
Это код для конвейеров элементов:
class myExporter(object):
def __init__(self):
self.myCSV = csv.writer(open('out.csv', 'wb'))
self.myCSV.writerow(['Job Role', 'Company','Location','Description','Read More'])
def process_item(self, item, spider):
self.myCSV.writerow([item['job_role'], item['company'], item['location'], item['desc'], item['read_more']])
return item
Это работает нормально. Теперь я должен очистить следующие сайты (например), используя тот же паук.
Я должен очистить все теги вышеупомянутых веб-сайтов, сохранить их в CSV-файл, используя конвейеры элементов.
На самом деле, список сайтов, которые нужно удалить, бесконечен. В этом проекте пользователь введет URL-адрес, и удаленные результаты будут возвращены этому пользователю. Итак, я хочу универсальный паук, который может очистить любой сайт.
Для одного сайта это работает нормально. Но как это сделать для нескольких сайтов, имеющих разную структуру? Достаточно ли Scrapy для ее решения?
2 ответа
Различный паук будет лучше. Вы можете использовать API для запуска Scrapy из сценария вместо обычного способа запуска Scrapy crawl. Помните, что Scrapy построен поверх асинхронной сетевой библиотеки Twisted, поэтому вам нужно запустить ее внутри Twisted реактора.,
Я думаю, что вам нужно создать универсального паука, чтобы очистить данные с разных сайтов. Это можно сделать, добавив сайт один за другим к пауку и обобщив код.
Это будет очень обширный код, если сайты будут совсем другими. Исходя из ваших требований, мы можем обобщить код и сделать паука, который дает вышеуказанные данные, если какой-либо веб-сайт предоставляется.