首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将真实URL通过Scrapy-Splash传递到字典

将真实URL通过Scrapy-Splash传递到字典
EN

Stack Overflow用户
提问于 2019-02-01 18:34:17
回答 1查看 1.1K关注 0票数 2

当试图通过('url‘:response.request.url)将url保存到字典中时,Scrapy从Scrapy中保存所有相同的url (http://localhost:8050/render.html)

我尝试过添加额外的参数,这些参数将传递真正的URL,但没有效果。

代码语言:javascript
复制
from scrapy import Spider
from scrapy.http import FormRequest
from scrapy.utils.response import open_in_browser
from scrapy import Request
import scrapy
from scrapy_splash import SplashRequest

class QuotesJSSpider(scrapy.Spider):
    name = 'quotesjs'
    start_urls = ('https://www.facebook.com/login',)
    custom_settings = {
        'SPLASH_URL': 'http://localhost:8050',
        'DOWNLOADER_MIDDLEWARES': {
            'scrapy_splash.SplashCookiesMiddleware': 723,
            'scrapy_splash.SplashMiddleware': 725,
            'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
        },
        'SPIDER_MIDDLEWARES': {
            'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
        },
        'DUPEFILTER_CLASS': 'scrapy_splash.SplashAwareDupeFilter',
    }

    def parse(self, response):
        token = response.xpath('//*[@id="u_0_a"]').extract_first()
        return FormRequest.from_response(response,
                                         formdata={'lgndim' : token,
                                                   'pass': 'xxx',
                                                   'email': 'xxxx'},
                                         callback=self.load_sites)

    def load_sites(self, response):
            urls = [
                'https://www.facebook.com/page1/about',
                'https://www.facebook.com/page2/about',
            ]
            for url in urls:
                yield SplashRequest(url=url, callback=self.scrape_pages)

    def scrape_pages(self, response):
        shops = {
            'company_name' : response.css('title::text').extract(),
            'url' : response.request.url,

        }

        yield shops

结果应该如下:'url‘:https://www.facebook.com/page1/about

而不是这个:'url‘:http://localhost:8050/render.html

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-02 21:46:33

原始请求的url可以在这里获得:response.request._original_url

为了避免不得不访问内部属性,您还可以尝试:

  • 在元中传递url:
代码语言:javascript
复制
    def load_sites(self, response):
                urls = [
                    'https://www.facebook.com/page1/about',
                    'https://www.facebook.com/page2/about',
                ]
                for url in urls:
                    yield SplashRequest(url=url, callback=self.scrape_pages, meta={'original_url': url})

    def scrape_pages(self, response)
        shops = {
                'company_name' : response.css('title::text').extract(),
                'url' : response.meta['original_url'],
        }
        yield shops
  • 使用响应中的url:
代码语言:javascript
复制
    def scrape_pages(self, response):
        shops = {
            'company_name' : response.css('title::text').extract(),
            'url' : response.url,
        }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54485316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档