Nerotix
Nerotix

Reputation: 375

Scrapy not yielding result (crawled 0 pages)

Trying to figure out how scrapy works and using it to find information on forums.

items.py

import scrapy


class BodybuildingItem(scrapy.Item):
    # define the fields for your item here like:
    title = scrapy.Field()
    pass

spider.py

from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from bodybuilding.items import BodybuildingItem

class BodyBuildingSpider(BaseSpider):
    name = "bodybuilding"
    allowed_domains = ["forum.bodybuilding.nl"]
    start_urls = [
        "https://forum.bodybuilding.nl/fora/supplementen.22/"
    ]

    def parse(self, response):
        responseSelector = Selector(response)
        for sel in responseSelector.css('li.past.line.event-item'):
            item = BodybuildingItem()
            item['title'] = sel.css('a.data-previewUrl::text').extract()
            yield item

The forum I'm trying to get the post titles from in this example is this: https://forum.bodybuilding.nl/fora/supplementen.22/

However I keep getting no results:

class BodyBuildingSpider(BaseSpider): 2017-10-07 00:42:28 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: bodybuilding) 2017-10-07 00:42:28 [scrapy.utils.log] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'bodybuilding.spiders', 'SPIDER_MODULES': ['bodybuilding.spiders'], 'ROBOTSTXT_OBEY': True, 'BOT_NAME': 'bodybuilding'} 2017-10-07 00:42:28 [scrapy.middleware] INFO: Enabled extensions: ['scrapy.extensions.memusage.MemoryUsage', 'scrapy.extensions.logstats.LogStats', 'scrapy.extensions.corestats.CoreStats'] 2017-10-07 00:42:28 [scrapy.middleware] INFO: Enabled downloader middlewares: ['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware', 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 'scrapy.downloadermiddlewares.retry.RetryMiddleware', 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 'scrapy.downloadermiddlewares.stats.DownloaderStats'] 2017-10-07 00:42:28 [scrapy.middleware] INFO: Enabled spider middlewares: ['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware', 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 'scrapy.spidermiddlewares.depth.DepthMiddleware'] 2017-10-07 00:42:28 [scrapy.middleware] INFO: Enabled item pipelines: [] 2017-10-07 00:42:28 [scrapy.core.engine] INFO: Spider opened 2017-10-07 00:42:28 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2017-10-07 00:42:28 [scrapy.core.engine] DEBUG: Crawled (404) https://forum.bodybuilding.nl/robots.txt> (referer: None) 2017-10-07 00:42:29 [scrapy.core.engine] DEBUG: Crawled (200) https://forum.bodybuilding.nl/fora/supplementen.22/> (referer: None) 2017-10-07 00:42:29 [scrapy.core.engine] INFO: Closing spider (finished) 2017-10-07 00:42:29 [scrapy.statscollectors] INFO: Dumping Scrapy stats: {'downloader/request_bytes': 469, 'downloader/request_count': 2, 'downloader/request_method_count/GET': 2, 'downloader/response_bytes': 22878, 'downloader/response_count': 2, 'downloader/response_status_count/200': 1, 'downloader/response_status_count/404': 1, 'finish_reason': 'finished', 'finish_time': datetime.datetime(2017, 10, 6, 22, 42, 29, 223305), 'log_count/DEBUG': 2, 'log_count/INFO': 7, 'memusage/max': 31735808, 'memusage/startup': 31735808, 'response_received_count': 2, 'scheduler/dequeued': 1, 'scheduler/dequeued/memory': 1, 'scheduler/enqueued': 1, 'scheduler/enqueued/memory': 1, 'start_time': datetime.datetime(2017, 10, 6, 22, 42, 28, 816043)} 2017-10-07 00:42:29 [scrapy.core.engine] INFO: Spider closed (finished)

I have been following the guide here: http://blog.florian-hopf.de/2014/07/scrapy-and-elasticsearch.html

Update 1:

As someone told me I needed to update my code to the new standards, which I did but it didnt change the outcome:

from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from bodybuilding.items import BodybuildingItem

class BodyBuildingSpider(BaseSpider):
    name = "bodybuilding"
    allowed_domains = ["forum.bodybuilding.nl"]
    start_urls = [
        "https://forum.bodybuilding.nl/fora/supplementen.22/"
    ]

    def parse(self, response):
        for sel in response.css('li.past.line.event-item'):
            item = BodybuildingItem()
            yield {'title': title.css('a.data-previewUrl::text').extract_first()}
            yield item

Last update with fix

After some good help I finally got it working with this spider:

import scrapy

class BlogSpider(scrapy.Spider):
    name = 'bodybuilding'
    start_urls = ['https://forum.bodybuilding.nl/fora/supplementen.22/']

    def parse(self, response):
        for title in response.css('h3.title'):
            yield {'title': title.css('a::text').extract_first()}
            next_page_url = response.xpath("//a[text()='Volgende >']/@href").extract_first()
            if next_page_url:
                 yield response.follow(next_page_url, callback=self.parse)

Upvotes: 0

Views: 375

Answers (1)

Tarun Lalwani
Tarun Lalwani

Reputation: 146630

You should use response.css('li.past.line.event-item') and there is no need for responseSelector = Selector(response).

Also the CSS you are using li.past.line.event-item, is no more valid, so you need update those first based on the latest web page

To get the next page URL you can use

>>> response.css("a.text::attr(href)").extract_first()
'fora/supplementen.22/page-2'

And then use response.follow to follow this relative url

Edit-2: Next Page processing correction

The previous edit didn't work because on the next page it matches the previous page url, so you need to use below

next_page_url = response.xpath("//a[text()='Volgende >']/@href").extract_first()
if next_page_url:
   yield response.follow(next_page_url, callback=self.parse)

Edit-1: Next Page processing

next_page_url = response.css("a.text::attr(href)").extract_first()
if next_page_url:
   yield response.follow(next_page_url, callback=self.parse)

Upvotes: 1

Related Questions