Python3 Scrapy 网络爬虫
Python3 Scrapy Webcrawler
为了我的工作,我不得不写一个爬虫,它只保存页面的标题,交货状态和产品数量。
这是我的默认蜘蛛代码:
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 文件
感谢大家的帮助
本质上是基于 selectors 的 scrapy 提取数据,这里我们使用 XPATH selectors,但如果您愿意,也可以使用 CSS selectors。请参阅 here 了解介绍。
Here 是关于从文档中的 Scrapy 提取数据的更多信息。
我们正在做的是根据抓取 HTML 时 scrapy 获得的响应生成字典。键是我们的行,值是每行的列。
代码示例
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()
}
解释
一个 yield 语句 returns 的值被称为延迟,它与 return 相关但有很大不同。我建议您查找 here 以了解有关区别的更多详细信息。
response.xpath() 方法除了一个 XPATH selector 并且可以抓取数据。 get() 用于获取此数据,仅一次。如果有多个 html 标签具有该 XPATH select,则可以使用 getall() 获取所有结果。
//
- 搜索整个 HTML
h1
- 我们要从中获取数据的标签
[@class=""]
- 我们想要 select class="" 的 h1 标签
/text()
- 抓取 html 标签内的文本
get()
scrapy 抓取这个结果。
在产品中,class= "col-6"
在 HTML 中有多个标签,所以我们只抓取第一个标签,因为 response.xpath()
return 是一个列表。我们使用了 get()
方法,然后使用 strip()
去除任何白色 space.
在交付状态与上述类似,但我们使用 replace()
方法去掉 /.
当你 运行 scrapy 脚本时,如果你想要 JSON 格式,请使用 scrapy crawl quotes -o quotes.json
。更多信息 here 在文档中
您应该查看文档中的 scrapy 教程 here。这对于掌握基本的刮刀非常有帮助。这是我们生成基于 XPATH selectors.
的字典
附加信息
除了最结构化的数据,我建议您查找用于存储数据的 Items 和 ItemLoaders。当您 运行 遇到需要清理的数据问题时,这些会更加灵活。生成字典是从 scrapy 获取数据的最简单方法。
为了我的工作,我不得不写一个爬虫,它只保存页面的标题,交货状态和产品数量。
这是我的默认蜘蛛代码:
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 文件
感谢大家的帮助
本质上是基于 selectors 的 scrapy 提取数据,这里我们使用 XPATH selectors,但如果您愿意,也可以使用 CSS selectors。请参阅 here 了解介绍。
Here 是关于从文档中的 Scrapy 提取数据的更多信息。
我们正在做的是根据抓取 HTML 时 scrapy 获得的响应生成字典。键是我们的行,值是每行的列。
代码示例
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()
}
解释
一个 yield 语句 returns 的值被称为延迟,它与 return 相关但有很大不同。我建议您查找 here 以了解有关区别的更多详细信息。
response.xpath() 方法除了一个 XPATH selector 并且可以抓取数据。 get() 用于获取此数据,仅一次。如果有多个 html 标签具有该 XPATH select,则可以使用 getall() 获取所有结果。
//
- 搜索整个 HTMLh1
- 我们要从中获取数据的标签[@class=""]
- 我们想要 select class="" 的 h1 标签
/text()
- 抓取 html 标签内的文本get()
scrapy 抓取这个结果。
在产品中,class= "col-6"
在 HTML 中有多个标签,所以我们只抓取第一个标签,因为 response.xpath()
return 是一个列表。我们使用了 get()
方法,然后使用 strip()
去除任何白色 space.
在交付状态与上述类似,但我们使用 replace()
方法去掉 /.
当你 运行 scrapy 脚本时,如果你想要 JSON 格式,请使用 scrapy crawl quotes -o quotes.json
。更多信息 here 在文档中
您应该查看文档中的 scrapy 教程 here。这对于掌握基本的刮刀非常有帮助。这是我们生成基于 XPATH selectors.
的字典附加信息
除了最结构化的数据,我建议您查找用于存储数据的 Items 和 ItemLoaders。当您 运行 遇到需要清理的数据问题时,这些会更加灵活。生成字典是从 scrapy 获取数据的最简单方法。