首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3抓取网爬虫

Python3抓取网爬虫
EN

Stack Overflow用户
提问于 2020-07-20 08:37:29
回答 1查看 60关注 0票数 0

对于我的工作,我必须写一个爬虫,它只保存页面的标题,交付状态和产品的数量。

以下是我的默认蜘蛛代码:

代码语言:javascript
复制
import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
        'https://www.topart-online.com/de/Ahorn-japan.%2C-70cm%2C--36-Blaetter----Herbst/c-KAT282/a-150001HE'
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-1]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

我需要一个只包含以下类的输出文件:

产品名称、可用数量和交付情况

我不知道如何编辑代码,因为我在一个新文件中打印了这些值。我只知道如何将整个页面保存为一个新的.html文件。

谢谢你们的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-20 09:14:58

本质上是根据选择器提取数据,这里我们使用XPATH选择器,但如果愿意,可以使用CSS选择器。有关介绍,请参阅这里

这里是关于在文档中从Scrapy中提取数据的更多信息。

我们正在做的是从抓取HTML时得到的响应获取一个字典。键是我们的行,值是每一行的列。

代码示例

代码语言:javascript
复制
def parse(self, response):    
    yield {
           'title': response.xpath('//h1[@class="text-center text-md-left mt-0"]/text()').get(),
           'product': response.xpath('//div[@class="col-6"]/text()')[0].get().strip(),
           'delivery_status': response.xpath('//div[@class="availabilitydeliverytime"]/text()').get().replace('/','').strip()
          }

解释

what语句返回所谓的延迟值,它与返回相关,但却有很大的不同。我建议您查阅这里,以获得更多关于区别的详细信息。

response.xpath()方法例外于XPATH选择器,可以获取数据。get()用于获取这些数据,只需一次。如果有多个带有XPATH选择器的html标记,那么getall()可以用于获取所有结果。

  1. // -搜索整个HTML
  2. h1 -我们希望从
  3. [@class=""] -我们要选择class=的h1标签“”
  4. /text() -抓取html标记中的文本。
  5. get()抓取了这个结果。

在产品中,class= "col-6"中有多个标记,所以我们只抓取第一个标签,因为response.xpath()返回一个列表。我们使用get()方法,然后使用strip()去除任何空白。

在交付状态与上面类似,但是我们使用replace()方法来摆脱/。

当您运行scrapy脚本时,如果您想要使用JSON格式,可以使用scrapy crawl quotes -o quotes.json。文档中的更多信息这里

您应该查看docs 这里中的刮伤教程。这将对掌握基本刮板非常有帮助。这里我们将生成一个基于XPATH选择器的字典。

更多信息

对于最结构化的数据,我建议您查找项和ItemLoaders来存储数据。当您遇到需要清理的数据出现问题时,这些方法要灵活得多。生成字典是从刮伤中获取数据的最简单方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62991582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档