- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在抓取http://www.sephora.com/lipstick使用 scrapy 爬行蜘蛛。我应该如何设置 LinkExtractor
才能废弃所有页面?`
class SephoraSpider(CrawlSpider):
name = "sephora"
# custom_settings = {"IMAGES_STORE": '../images/sephora'}
# allowed_domains = ["sephora.com/"]
start_urls = [
'http://www.sephora.com/lipstick'
# 'http://www.sephora.com/eyeshadow',
# 'http://www.sephora.com/foundation-makeup'
]
rules = (Rule(LinkExtractor(
# restrict_xpaths='//*[@id="main"]/div[4]/div[5]/div[1]/div/div[2]/div[3]/div[7]',
allow=('sephora.com/')
),
callback = 'parse_items',
follow =True),)
def parse(self,response):
# category = ['lipstick']
# for cat in category:
full_url = 'http://www.sephora.com/rest/products/?currentPage=1&categoryName=lipstick&include_categories=true&include_refinements=true'
my_request = scrapy.Request(full_url, callback = 'parse_items')
my_request.meta['page'] = {'to_replace':"currentPage=1"}
yield my_request
def parse_items(self,response):
# cat_json = response.xpath('//script[@id="searchResult"]/text()').extract_first()
# all_url_data = json.loads(cat_json.encode('utf-8'))
# if "products" not in all_url_data:
# return
# products = all_url_data['products']
products = json.loads(response.body)['products']
print(products)
for each_product in products:
link = each_product['product_url']
full_url = "http://www.sephora.com"+link
name = each_product["display_name"]
if 'list_price' not in each_product['derived_sku']:
price = each_product['derived_sku']['list_price_max']
else:
price = each_product['derived_sku']["list_price"]
brand = each_product["brand_name"]
item = ProductItem(
name=name,
price=price,
brand=brand,
full_url=full_url,
category=response.url[23:])
yield item
to_replace = response.meta['page']['to_replace']
cat = response.meta['page']['category']
next_number = int(to_replace.replace("currentPage=", "")) + 1
next_link = response.url.replace(
to_replace, "currentPage=" + str(next_number))
print(next_link)
my_request = scrapy.Request(
next_link,
self.parse_items)
my_request.meta['page'] = {
"to_replace": "currentPage=" + str(next_number),
}
yield my_request
我现在遇到这个错误。
2017-06-12 12:43:30 [scrapy] DEBUG: Crawled (200) <GET http://www.sephora.com/rest/products/?currentPage=1&categoryName=lipstick&include_categories=true&include_refinements=true> (referer: http://www.sephora.com/makeup-cosmetics)
2017-06-12 12:43:30 [scrapy] ERROR: Spider error processing <GET http://www.sephora.com/rest/products/?currentPage=1&categoryName=lipstick&include_categories=true&include_refinements=true> (referer: http://www.sephora.com/makeup-cosmetics)
Traceback (most recent call last):
File "/Users/Lee/anaconda/lib/python2.7/site-packages/scrapy/utils/defer.py", line 45, in mustbe_deferred
result = f(*args, **kw)
File "/Users/Lee/anaconda/lib/python2.7/site-packages/scrapy/core/spidermw.py", line 48, in process_spider_input
return scrape_func(response, request, spider)
File "/Users/Lee/anaconda/lib/python2.7/site-packages/scrapy/core/scraper.py", line 145, in call_spider
dfd.addCallbacks(request.callback or spider.parse, request.errback)
File "/Users/Lee/anaconda/lib/python2.7/site-packages/twisted/internet/defer.py", line 299, in addCallbacks
assert callable(callback)
AssertionError
2017-06-12 12:43:30 [scrapy] INFO: Closing spider (finished)
最佳答案
简短回答:不要。
长答案:我会采取不同的做法。分页链接不会返回新页面。相反,他们向此 URL 发送 GET
请求:
http://www.sephora.com/rest/products/?currentPage=2&categoryName=lipstick&include_categories=true&include_refinements=true
。
在这里您可以看到浏览器发出的请求和响应。在本例中,单击 pagatinino 链接会生成一个 JSON 对象,其中包含页面上显示的所有产品。
现在查看请求的响应
选项卡。在products
下可以看到从0到59的数字,这是页面上显示的产品,以及产品的所有信息,例如id
、display_name
以及,哦,url
。
尝试右键单击请求并选择在新选项卡中打开
以在浏览器中查看响应。现在尝试将丝芙兰主页上的每页项目数设置为不同的内容。你看到会发生什么吗? JSON 对象现在返回更少或更多的项目(取决于您的选择)。
那么我们现在如何处理这些信息呢?
理想情况下,我们可以直接在以下位置请求每个页面的 JSON 对象(只需将请求网址从 current_page=2
更改为 current_page=3
)我们的蜘蛛并遵循那里提供的 URL(在 products/n-product/product_url
下),然后抓取各个对象(或者如果您想要的话,只提取产品列表)。
幸运的是,Scrapy(更好,Python)允许您解析 JSON 对象并使用解析的数据执行任何您想要的操作。幸运的是,Sephora 允许您选择显示每页的所有项目,从而将请求 URL 更改为 ?pageSize=-1
。
您要做的就是产生
对产生JSON对象的url的请求,并定义一个处理该对象的解析
函数。
只是一个简单的示例,它将提取每个产品的 url 并生成对此 url 的请求(稍后我将尝试提供更详细的示例):
import json
data = json.loads(response.body)
for product in data["products"]:
url = response.urljoin(product["product_url"])
yield scrapy.Request(url=url, callback=self.parse_products)
给你了。学习向网站发出请求确实是值得的,因为您可以轻松地操纵请求 URL,使您的生活更轻松。例如,您可以更改 URL 中的 categoryName
以解析另一个类别。
关于python - 如何使用crawlspider跳转到下一页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44493147/
我一直在学习如何使用 scrapy,尽管我一开始对 python 的经验很少。我开始学习如何使用 BaseSpider 进行抓取。现在我正在尝试抓取网站,但我遇到了一个让我很困惑的问题。这是来自官方网
我对 scrapy Crawlspider 有一个问题:基本上,如果引发 CloseSpider 异常,它不会像应该的那样退出。下面是代码: from scrapy.spiders import Cr
我正在尝试从此类别页面上给出的所有(#123)详细信息页面中抓取一些属性 - http://stinkybklyn.com/shop/cheese/但 scrapy 无法遵循我设置的链接模式,我也检查
我目前正在用 scrapy 编写一个爬虫。我想抓取网站上显示的所有文本,不是单个页面,而是所有子页面。我正在使用 CrawlSpider,因为我认为它也是为了抓取其他页面而设计的。这是我到目前为止编写
我正在开发一个 CrawlSpider ,它获取多个 Domain 对象(它包含 main_url 和 name -域名)。然后它会抓取整个页面的每个 Domain 对象。 因此有一个 Domain
对于我试图抓取的页面,我有时会在我的响应中返回一个“占位符”页面,其中包含一些自动重新加载的 javascript,直到它获得真正的页面。我可以检测到这种情况何时发生,并且我想重试下载和抓取页面。我在
我对规则在 CrawlSpider 中的评估顺序有疑问。如果我有以下代码: from scrapy.contrib.spiders.crawl import CrawlSpider, Rule fro
我正在尝试导航到每个县,然后从这里导航到每个县的每个城市: http://www.accountant-finder.com/CA/California-accountants.html 我的代码打开
Crawlspider 仅获取列表首页上匹配链接的子集。不久之后,它移动到第二页,成功跟踪所有匹配的链接,完全符合预期。如何让 Crawlspider 在进入第二页之前遵循所有匹配的链接? 我在第二条
我写了一个 scrapy crawlspider 来抓取一个结构类似于类别页面 > 类型页面 > 列表页面 > 项目页面的站点。在类别页面上有很多机器类别,每个类别都有一个包含很多类型的类型页面,每个
我是 Scrapy 的新手,我正在做一个抓取练习,我正在使用 CrawlSpider。虽然 Scrapy 框架工作得很好并且它遵循相关链接,但我似乎无法让 CrawlSpider 抓取第一个链接(主页
我创建的 CrawlSpider 没有正常工作。它解析第一页,然后停止而不继续到下一页。我做错了什么但无法检测到。希望有人给我一个提示,我应该做什么来纠正它。 “items.py”包括: from s
我在 Scrapy 中编写了一个蜘蛛,它基本上做得很好,并且完全按照它应该做的。 问题是我需要对它做一些小的改变,我尝试了几种方法都没有成功(例如修改 InitSpider)。这是脚本现在应该执行的操
我正在尝试创建一个实现 scrapy CrawlSpider 的 ExampleSpider。我的 ExampleSpider 应该能够处理仅包含艺术家信息的页面,仅包含专辑信息的页面,以及包含专辑和
问题陈述: 我在文件名为 myurls.csv 的每一行中都有一个论坛 url 列表,如下所示: https://www.drupal.org/user/3178461/track https://w
我想知道是否有一种方法可以在 scrapy 中的同一个蜘蛛中同时使用 Base 蜘蛛和 Crawl 蜘蛛! 假设我只想抓取 start_url 中提到的一个 url,然后对同一 start_url 中
我的蜘蛛有一些问题。我使用 splash 和 scrapy 来获取由 JavaScript 生成的“下一页”的链接。从第一页下载信息后,我想从后面的页面下载信息,但是LinkExtractor功能不能
最初的问题 我正在编写一个 CrawlSpider 类(使用 scrapy 库)并依赖大量的 scrapy 异步魔法 使其工作。在这里,精简了: class MySpider(CrawlSpider)
我一直在努力理解在网络抓取中使用 BaseSpider 和 CrawlSpider 的概念。我读过 docs.但是BaseSpider上没有提及。如果有人能解释一下 BaseSpider 和 Craw
我已经成功地使用 Scrapy 编写了一个非常简单的爬虫,具有这些给定的约束: 存储所有链接信息(例如: anchor 文本、页面标题),因此有 2 个回调 使用 CrawlSpider 来利用规则,
我是一名优秀的程序员,十分优秀!