我正在尝试使用scrapy从网页上抓取产品信息.我的待删节网页如下所示:
我试图复制next-button-ajax-call但是无法正常工作,所以我试试了selenium.我可以在一个单独的脚本中运行selenium的webdriver,但我不知道如何与scrapy集成.我应该把硒部分放在我的scrapy蜘蛛里?
我的蜘蛛非常标准,如下所示:
class ProductSpider(CrawlSpider):
name = "product_spider"
allowed_domains = ['example.com']
start_urls = ['http://example.com/shanghai']
rules = [
Rule(SgmlLinkExtractor(restrict_xpaths='//div[@id="productList"]//dl[@class="t2"]//dt'), callback='parse_product'),
]
def parse_product(self, response):
self.log("parsing product %s" %response.url, level=INFO)
hxs = HtmlXPathSelector(response)
# actual data follows
Run Code Online (Sandbox Code Playgroud)
任何想法都表示赞赏.谢谢!
免责声明:我在StackOverflow上看过很多其他类似的帖子,并尝试以同样的方式做到这一点,但他们似乎没有在这个网站上工作.
我正在使用Python-Scrapy从koovs.com获取数据.
但是,我无法获得动态生成的产品大小.具体来说,如果有人可以通过此链接的下拉菜单指导我获取"不可用"尺寸标签,我将不胜感激.
我能够静态获取大小列表,但这样做我只获得大小列表,但不能获得哪些大小.
我想为一些蜘蛛启用一些http代理,并为其他蜘蛛禁用它们.
我可以这样做吗?
# settings.py
proxy_spiders = ['a1' , b2']
if spider in proxy_spider: #how to get spider name ???
HTTP_PROXY = 'http://127.0.0.1:8123'
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.RandomUserAgentMiddleware': 400,
'myproject.middlewares.ProxyMiddleware': 410,
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None
}
else:
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.RandomUserAgentMiddleware': 400,
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None
}
Run Code Online (Sandbox Code Playgroud)
如果上面的代码不起作用,还有其他建议吗?
我正在从事某些与股票相关的项目,我的任务是在过去 5 年里每天抓取所有数据。即从 2016 年至今。我特别想到使用selenium,因为我可以使用爬虫和机器人根据日期抓取数据。因此,我将按钮单击与 selenium 结合使用,现在我希望 scrappy 提供与 selenium 浏览器显示的相同数据。这是我现在正在开发的网站。我在 scrappy Spider 中编写了以下代码。
class FloorSheetSpider(scrapy.Spider):
name = "nepse"
def start_requests(self):
driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())
floorsheet_dates = ['01/03/2016','01/04/2016', up to till date '01/10/2022']
for date in floorsheet_dates:
driver.get(
"https://merolagani.com/Floorsheet.aspx")
driver.find_element(By.XPATH, "//input[@name='ctl00$ContentPlaceHolder1$txtFloorsheetDateFilter']"
).send_keys(date)
driver.find_element(By.XPATH, "(//a[@title='Search'])[3]").click()
total_length = driver.find_element(By.XPATH,
"//span[@id='ctl00_ContentPlaceHolder1_PagerControl2_litRecords']").text
z = int((total_length.split()[-1]).replace(']', ''))
for data in range(z, z + 1):
driver.find_element(By.XPATH, "(//a[@title='Page {}'])[2]".format(data)).click()
self.url = driver.page_source
yield Request(url=self.url, callback=self.parse)
def parse(self, response, **kwargs):
for value in response.xpath('//tbody/tr'):
print(value.css('td::text').extract()[1])
print("ok"*200)
Run Code Online (Sandbox Code Playgroud)
更新:回答后错误是 …
有没有办法有效地将Selenium集成到Scrapy中,以获得页面渲染功能(为了生成屏幕截图)?
我看到的很多解决方案只是在 Scrapy已经处理完请求后在WebDriver上抛出一个Scrapy请求/响应URL ,然后就这样做了.这会产生两倍的请求,在许多方面失败(需要登录的站点,具有动态或伪随机内容的站点等),并使许多扩展/中间件无效.
是否有任何"好"的方式让两个人一起工作?有没有更好的方法来生成我正在抓取的内容的屏幕截图?