当前位置: 首页 > 面试题库 >

每个网址两次Scrapy + Selenium请求两次

董良策
2023-03-14
问题内容

import scrapy
from selenium import webdriver

class ProductSpider(scrapy.Spider):
    name = "product_spider"
    allowed_domains = ['ebay.com']
    start_urls = ['http://www.ebay.com/sch/i.html?_odkw=books&_osacat=0&_trksid=p2045573.m570.l1313.TR0.TRC0.Xpython&_nkw=python&_sacat=0&_from=R40']

    def __init__(self):
        self.driver = webdriver.Firefox()

    def parse(self, response):
        self.driver.get(response.url)

        while True:
            next = self.driver.find_element_by_xpath('//td[@class="pagn-next"]/a')

            try:
                next.click()

                # get the data and write it to scrapy items
            except:
                break

        self.driver.close()

此解决方案效果很好,但是它对相同的URL两次请求,一个是scrapy Scheduler,另一个是Selenium Web驱动程序。

与没有selenium的苛刻要求相比,完成这项工作将花费两倍的时间。如何避免这种情况?


问题答案:

这是解决这个问题的有用技巧。

*为硒 *创建一个Web服务 ,在本地运行它

from flask import Flask, request, make_response
from flask_restful import Resource, Api
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

app = Flask(__name__)
api = Api(app)

class Selenium(Resource):
    _driver = None

    @staticmethod
    def getDriver():
        if not Selenium._driver:
            chrome_options = Options()
            chrome_options.add_argument("--headless")

            Selenium._driver = webdriver.Chrome(chrome_options=chrome_options)
        return Selenium._driver

    @property
    def driver(self):
        return Selenium.getDriver()

    def get(self):
        url = str(request.args['url'])

        self.driver.get(url)

        return make_response(self.driver.page_source)

api.add_resource(Selenium, '/')

if __name__ == '__main__':
    app.run(debug=True)

现在将使用硒Chrome / Firefox驱动程序返回编译后的网页。

现在我们的蜘蛛会是什么样子,

import scrapy
import urllib


class ProductSpider(scrapy.Spider):
    name = 'products'
    allowed_domains = ['ebay.com']
    urls = [
        'http://www.ebay.com/sch/i.html?_odkw=books&_osacat=0&_trksid=p2045573.m570.l1313.TR0.TRC0.Xpython&_nkw=python&_sacat=0&_from=R40',
    ]

    def start_requests(self):
        for url in self.urls:
            url = 'http://127.0.0.1:5000/?url={}'.format(urllib.quote(url))
            yield scrapy.Request(url)

    def parse(self, response):
        yield {
            'field': response.xpath('//td[@class="pagn-next"]/a'),
        }


 类似资料:
  • 问题内容: 我正在构建Blob存储系统,我选择了Go作为编程语言。我创建了一个流,以执行从客户端到Blob服务器的分段文件上传。 流工作正常,但我想从请求正文中进行sha1哈希处理。我需要io。复制身体两次。创建了sha1,但是多部分流之后0字节。 用于创建哈希 用于将身体分为多个部分 任何想法我该怎么做? 客户上传 sha1函数 } 上传句柄 } 问题答案: 您不能直接执行此操作,但可以编写在i

  • 问题内容: type ValidationModel struct { Name string Email string Password string } 首先,我使用govalidator验证请求正文。 在验证了请求之后,我再次将请求主体解码为用户结构,但已使用validationModel读取了请求主体一次,因此当我尝试再次将其解码为用户时,它没有提供任何值。 我在这里可以想到两种解决方案:

  • 正在学习 React 不懂为什么用了 useEffect 还会发起两次请求,应该怎么解决?

  • 编写一个程序,向用户询问一顿饭的费用,计算这顿饭的小费(18%),计算这顿饭的税收(8.25%),然后显示这顿饭的费用、这顿饭的小费金额、这顿饭的税收这顿饭,以及这顿饭的总数,这是成本、小费和税额的总和 这是我的密码: Python Shell上的输出: 输入餐费:19.95 成本:19.95 输入餐费:19.95 提示:3.59 输入餐费:19.95 税费:1.65 输入餐费:19.95 这可能

  • 疯掉了 安克面试断了两次网 我说着说着面试官打来电话说我网断了 状态大崩 脑袋一片空白 呜呜呜呜呜呜 心态也崩了

  • 我试图做简单的超文本传输协议后请求使用以下代码:Golang代码从另一个SO后 它发送了两次http请求(我尝试了向自己的web服务和Firebase消息服务器发送)。有人知道怎么回事吗?非常感谢。 编辑忽略我,找出是AVG反病毒造成的问题。如果我这样做:然后按enter键一次,AVG会中断,说它已经扫描了它,然后让它运行。这会导致http调用两次。如果我在运行前禁用了防病毒软件,那么http请求