python - 修改scrapy进程请求
问题描述
import scrapy
from selenium import webdriver
from scrapy.loader import ItemLoader
from scrapy.loader.processors import Join,MapCompose
from scrapy.crawler import CrawlerProcess
from scrapy.http import HtmlResponse
class TestSpider(scrapy.Spider):
name = "plus"
start_urls = ['http://httpbin.org/anything']
def __init__(self):
scrapy.Spider.__init__(self)
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument("disable-infobars")
options.add_argument('--disable-browser-side-navigation')
options.add_argument("--start-maximized")
self.driver = webdriver.Chrome(chrome_options=options)
def __del__(self):
try:
scrapy.Spider.__del__(self)
except:
print("No __del__ method")
def process_request(self, request, spider):
self.driver.get(request.url)
body = self.driver.page_source
print(body)
return HtmlResponse(self.driver.current_url, body=body, encoding='utf-8', request=request)
def parse(self,response):
print(response.text)
self.driver.quit()
process = CrawlerProcess({'LOG_LEVEL':'INFO',
})
process.crawl(TestSpider)
process.start()
我遇到的问题是process_request
当scrapy发出请求时没有调用它。如何操纵 Scrapy 处理请求的方式,这样我就不会发出两个请求,一个通过 Scrapy,一个通过 Selenium。
解决方案
阿姆贾斯德。 wishmaster是完全正确的,你应该使用下载中间件并将 Selenium 放在那里。但这不是一个好主意,因为在这种情况下,您的爬虫将是同步的。一个更好的主意是使用与水族馆合作的 Splash 或 Splash cluster
推荐阅读
- r - 如何从 casandara 和 S3 读取/写入 sparkR 和 sparklyr 数据帧?
- ansible - 无法将 ansible_user 与本地连接一起使用
- amazon-web-services - 从 CLI 上传 VPC 中的 Lambda 函数时遇到问题
- algorithm - 清理堆的时间复杂度是多少?
- laravel - 具有条件约束的查询范围
- c++ - 使用继承修复大型类
- c++ - C ++ 11访问类内存变量是否具有本地副本
- r - 如何在另一列中查找名称子集?
- python - 在模板中显示来自外键的值
- javascript - 在 Javascript 中获取当前地理位置