Python 使用Scrapy在规则中的URL列表上使用参数进行爬网迭代
我是Scrapy和Python的新手。我想做以下工作:Python 使用Scrapy在规则中的URL列表上使用参数进行爬网迭代,python,python-3.x,web-scraping,scrapy,scrapy-spider,Python,Python 3.x,Web Scraping,Scrapy,Scrapy Spider,我是Scrapy和Python的新手。我想做以下工作: 访问url并获取包含“店铺/产品”的所有链接,作为url的一部分。这些链接看起来像:“ 废弃一个起始url的url,并获取产品总数,total。在代码中,总计=每个类别的项目数 最后,向url添加“?sort=Top&size=12&start=PARAM”。在每次迭代中,PARAM必须增加12,以防PARAM爬行器访问urlhttp://www.example.com/shop/products,提取元素中的所有链接,并使用parse\u
http://www.example.com/shop/products
,提取
元素中的所有链接,并使用parse\u list
回调获取所有链接。在我看来,这并不是你所期待的行为——相反,你应该在规则中使用一些包含种子url和提取器的起始url,其中包含allow=r“shop/products”
此外,此部分'%s?sort=Top&size=12&start=%s%%(response.url,next_start)
是错误的,因为response.url包含完整的url,包括GET参数,因此每次您将带有参数的部分附加到现有参数字符串中时,都会像这样?sort=Top&size=12&start=0?sort=Top&size=12&start=12?sort=Top&size=12&start=24
。在添加新字符串之前从url中清除参数,或者只使用FormRequest
作为传递参数的更方便的方法
顺便说一句,Scrapy有非常方便的交互式控制台用于调试,您可以使用
Scrapy.shell.inspect\u response
从spider的任何部分调用它,谢谢,mizhgun!这就是正在发生的事情!我将和debbuger一起测试这类东西。
import scrapy
import re
import datetime
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor
from scrapy.http.request import Request
class MySpider(CrawlSpider):
name = 'my_spider'
allowed_domains = ['example.com']
start_urls = ['http://www.example.com/shop/products']
rules = (
Rule(LxmlLinkExtractor(
restrict_xpaths=('.//li[@class="item"]/a')),
follow=False,
callback='parse_list'
),
)
def parse_list(self, response):
SET_SELECTOR = '.product'
for item in response.css(ITEM_SELECTOR):
NAME_SELECTOR = 'div[@class="product"]/h2/a/@title'
yield {
'name': item.xpath(NAME_SELECTOR).extract_first()
}
NUM_ITEMS_PER_CATEGORY_SELECTOR = 'div[@id="search"]/@data-count'
num_items_per_category = item.xpath(NUM_ITEMS_PER_CATEGORY_SELECTOR).extract_first()
nipc = int(0 if num_items_per_category is None else num_items_per_category)
try:
next_start = response.meta["next_start"]
except KeyError:
next_start = 0
if next_start <= nipc:
yield scrapy.Request(
response.urljoin('%s?sort=Top&size=12&start=%s' % (response.url, next_start)),
meta={"next_start": next_start + 12},
dont_filter=True,
callback = self.parse_list
)