Как очистить все содержимое каждой ссылки с помощью scrapy?
Я новичок в scrapy, я хотел бы извлечь все содержимое каждой рекламы из этого сайт. Поэтому я попробовал следующее:
from scrapy.spiders import Spider
from craigslist_sample.items import CraigslistSampleItem
from scrapy.selector import Selector
class MySpider(Spider):
name = "craig"
allowed_domains = ["craigslist.org"]
start_urls = ["http://sfbay.craigslist.org/search/npo"]
def parse(self, response):
links = response.selector.xpath(".//*[@id='sortable-results']//ul//li//p")
for link in links:
content = link.xpath(".//*[@id='titletextonly']").extract()
title = link.xpath("a/@href").extract()
print(title,content)
детали:
# Define here the models for your scraped items
from scrapy.item import Item, Field
class CraigslistSampleItem(Item):
title = Field()
link = Field()
однако, когда я запускаю краулер, я ничего не получаю:
$ scrapy crawl --nolog craig
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
таким образом, мой вопрос: Как я могу ходить по каждому url, попасть внутрь каждой ссылки и сканировать содержимое и заголовок? и какой из способов лучше всего это сделать?.
2 ответов
если вы хотите ползать, вы можете посмотреть на CrawlSpider
.
для создания базового проекта scrapy вы можете использовать команда:
scrapy startproject craig
затем добавьте паука и предметы:
craig/spiders/spider.py
from scrapy.spiders import CrawlSpider, Rule
from craig.items import CraigslistSampleItem
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor
from scrapy.selector import Selector
class MySpider(CrawlSpider):
name = "craig"
allowed_domains = ["craigslist.org"]
start_urls = ["http://sfbay.craigslist.org/search/npo"]
rules = (
Rule(LxmlLinkExtractor(
restrict_xpaths=(".//*[@id='sortable-results']//li//a")),
follow=False,
callback='parse_item'
),
)
def parse_item(self, response):
sel = Selector(response)
item = CraigslistSampleItem()
item['title'] = sel.xpath('//*[@id="titletextonly"]').extract_first()
item['body'] = sel.xpath('//*[@id="postingbody"]').extract_first()
item['link'] = response.url
yield item
craig/items.py
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
from scrapy.item import Item, Field
class CraigslistSampleItem(Item):
title = Field()
body = Field()
link = Field()
craig/settings.py
# -*- coding: utf-8 -*-
BOT_NAME = 'craig'
SPIDER_MODULES = ['craig.spiders']
NEWSPIDER_MODULE = 'craig.spiders'
ITEM_PIPELINES = {
'craig.pipelines.CraigPipeline': 300,
}
craig/pipelines.py
from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher
from scrapy.exporters import CsvItemExporter
class CraigPipeline(object):
def __init__(self):
dispatcher.connect(self.spider_opened, signals.spider_opened)
dispatcher.connect(self.spider_closed, signals.spider_closed)
self.files = {}
def spider_opened(self, spider):
file = open('%s_ads.csv' % spider.name, 'w+b')
self.files[spider] = file
self.exporter = CsvItemExporter(file)
self.exporter.start_exporting()
def spider_closed(self, spider):
self.exporter.finish_exporting()
file = self.files.pop(spider)
file.close()
def process_item(self, item, spider):
self.exporter.export_item(item)
return item
вы можете запустить паука, под управлением команда:
scrapy runspider scraper/spiders/spider.py
из корня вашего проекта.
он должен создать craig_ads.csv
в корне вашего проекта.
я пытаюсь ответить на ваш вопрос.
прежде всего, из-за вашего неверный запрос XPath вы получили пустой результат. По XPath ".//*[@id='sortable-results']//ul//li//p"
, расположенный соответствующих <p>
узлы правильно, хотя мне не нравится выражение вашего запроса. Однако я понятия не имею о вашем следующем выражении XPath ".//*[@id='titletextonly']"
и "a/@href"
, они не смогли найти ссылку и название, как вы ожидали. Возможно, ваше значение состоит в том, чтобы найти текст заголовка и гиперссылку на заголовок. Если да, то я поверьте, вам нужно изучить Xpath, и, пожалуйста, начните с HTML DOM.
я хочу проинструктировать вас, как сделать запрос XPath, так как есть много ресурсов в интернете. Я хотел бы упомянуть некоторые особенности Scrapy XPath selector:
- Scrapy XPath Селектор - улучшенная оболочка стандартного запроса XPath.
в стандартном запросе XPath он возвращает массив узлов DOM, которые вы запросили. Вы можете открыть разработку режим Вашего браузера (F12
), используйте консольную команду $x(x_exp)
чтобы проверить. Я настоятельно рекомендую проверить ваше выражение XPath таким образом. Это даст вам мгновенные результаты и сэкономить много времени. Если у вас есть время, ознакомьтесь с инструментами веб-разработки вашего браузера, которые помогут вам быстро понять структуру веб-страницы и найти нужную запись.
А, Scrapy response.xpath(x_exp)
возвращает массив Selector
объекты, соответствующие фактическому запросу XPath, который на самом деле непосредственно на