Как очистить все содержимое каждой ссылки с помощью 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:

  1. Scrapy XPath Селектор - улучшенная оболочка стандартного запроса XPath.

в стандартном запросе XPath он возвращает массив узлов DOM, которые вы запросили. Вы можете открыть разработку режим Вашего браузера (F12), используйте консольную команду $x(x_exp) чтобы проверить. Я настоятельно рекомендую проверить ваше выражение XPath таким образом. Это даст вам мгновенные результаты и сэкономить много времени. Если у вас есть время, ознакомьтесь с инструментами веб-разработки вашего браузера, которые помогут вам быстро понять структуру веб-страницы и найти нужную запись.

А, Scrapy response.xpath(x_exp) возвращает массив Selector объекты, соответствующие фактическому запросу XPath, который на самом деле непосредственно на