实际上,我最近刚刚为类似的东西构建了一个刮板。然而,最好的学习是通过实践和剖析代码并自己修改代码来实现它。
这是一个示例爬虫,它使用各种工具和 scrapy 来获取类别页面、书籍页面和下一页的信息。
link 中提供了一些额外信息,我在其中使用以下代码作为问题的一部分。也许,这对你也有用。
我建议使用下面的爬虫,通过收集页面左侧类别的信息来构建自己的爬虫。
刮板的快速分解:
BooksItem:
- 这里我们构建一个字段来存储来自 itemloader 的结果,有点像存储列表的变量。
BookSpider:
start_requests:
- yed 来自起始 url 的请求(我通常将内容存储为列表,以养成为我的项目使用多个起始 url 的习惯)。回调告诉您在哪里解析信息。
parse:
- 获取容器的 xpath,创建一个循环并设置一个项目加载器以引用
BooksItem 中的字段。找到项目的 xpath,并构建另一个带有书籍页面链接的请求。我们还可以通过 if 语句在下一页获取信息。
parse_book:
class BooksItem(scrapy.Item):
items = Field(output_processor=TakeFirst())
price = Field(output_processor=TakeFirst())
availability = Field(output_processor=TakeFirst())
class BookSpider(scrapy.Spider):
name = "books"
start_urls = ['https://books.toscrape.com']
custom_setting = {
'DOWNLOAD_DELAY': 1,
'ROBOTSTXT_OBEY': False,
'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36',
'CONCURRENT_REQUESTS': 100,
'CONCURRENT_REQUESTS_PER_IP': 100
}
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(
url,
callback=self.parse
)
def parse(self, response):
data = response.xpath('//div[@class = "col-sm-8 col-md-9"]//li')
for books in data:
loader = ItemLoader(BooksItem(), selector=books)
loader.add_xpath('items', './/article[@class="product_pod"]/h3/a//text()')
loader.add_xpath('price', './/p[@class="price_color"]//text()')
for url in books.xpath('.//h3/a//@href').getall():
yield scrapy.Request(
response.urljoin(url),
callback=self.parse_book,
cb_kwargs={'loader': loader}
)
# for next_page in [response.xpath('.//a[normalize-space()="next"]//@href').get()]:
next_page = response.xpath('.//a[normalize-space()="next"]//@href').get()
if next_page is not None:
yield response.follow(next_page, callback=self.parse)
def parse_book(self, response, loader):
book_quote = response.xpath('//p[@class="instock availability"]/i/following-sibling::text()').get().strip()
loader.add_value('availability', book_quote)
yield loader.load_item()