python - 如何获取url列表并在scrapy python中用于Web数据提取
问题描述
我正在使用 scrapy python 创建网络抓取工具。这是我的代码
import scrapy
class BlogSpider(scrapy.Spider):
name = 'blogspider'
start_urls = [
'https://perfumehut.com.pk/shop/',
]
def parse(self, response):
yield {
'product_link': response.css('a.product-image-link::attr("href")').get(),
'product_title': response.css('h3.product-title>a::text').get(),
'product_price': response.css('span.price > span > bdi::text').get(),
}
next_page = response.css('ul.page-numbers>li>a.next.page-numbers::attr("href")').get()
if next_page is not None:
print()
print(next_page)
print()
yield scrapy.Request(next_page)
def parse(self, response):
yield {
'title': response.css('h1::text').get(),
'batt': response.css('td.woocommerce-product-attributes-item__value p::text')[3].get(),
'brand': response.css('div.woodmart-product-brand img::attr(alt)').get(),
'brandimg': response.css('div.woodmart-product-brand img::attr(src)').get(),
'price': response.css('p.price').xpath('./span/bdi/text()').get(),
'r-price': response.css('p.price').xpath('./del/span/bdi/text()').get(),
's-sale': response.css('p.price').xpath('./ins/span/bdi/text()').get(),
'breadcrumbs': response.css('nav.woocommerce-breadcrumb a::text').getall(),
'tags': response.css('span.tagged_as a::text').getall(),
'attributes': response.css('td.woocommerce-product-attributes-item__value p::text').getall(),
'img': response.css('figure.woocommerce-product-gallery__image a::attr("href")').getall(),
'description': response.css('div.woocommerce-product-details__short-description p::text').get(),
'description1': response.css('#tab-description > div > div > p::text').getall(),
'description2': response.css('#tab-description > div > div > div > div > div > div > div > div > p::text').getall()
}
这是一个woocommerce网站。共有 57 页,每页 12 个产品。估计共有 684 种产品。
但是我的代码什么也没返回。
我在抓取 URL 时做错了什么?
解决方案
要提取所有页面信息,您需要提取下一页 url,然后解析 url。
这是一个简单的示例,我认为可以帮助您解决问题。
import scrapy
class BlogSpider(scrapy.Spider):
name = 'blogspider'
start_urls = [
'https://perfumehut.com.pk/shop/',
]
def parse(self, response):
yield {
'product_link': response.css('a.product-image-link::attr("href")').get(),
'product_title': response.css('h3.product-title>a::text').get(),
'product_price': response.css('span.price > span > bdi::text').get(),
}
next_page = response.css('ul.page-numbers>li>a.next.page-numbers::attr("href")').get()
if next_page is not None:
print()
print(next_page)
print()
yield scrapy.Request(next_page)
推荐阅读
- powershell - 在以指定字母开头的目录中递归列出文件
- mysql - 链接现有域名后,DigitalOcean droplet 上的 PHPmyAdmin 出现 404 Not Found 错误
- php - 写入数据库,并在同一 PHP 页面加载中检索更新的数据?
- python - 为什么 concurrent.futures 在返回 np.memmap 时会占用内存?
- sql - 2个select语句会导致彼此死锁吗?
- python - 多个子图大小一致的 Matplotlib 颜色条
- javascript - 如何仅在 div 上应用 javascript
- haskell - 如何将 DELETE 请求卷曲到 Yesod?
- integration-testing - 在集成测试中检索连接字符串
- r - 用 R 对数据帧中的缺失数据进行插值