当前位置:网站首页>scrapy 爬取当当图书名字图片
scrapy 爬取当当图书名字图片
2022-08-04 05:26:00 【Drizzlejj】
1。创建项目和创建爬虫参考上一篇博客。
2.dang.py
import scrapy
from scrapy_dangdang.items import ScrapyDangdangItem
class DangSpider(scrapy.Spider):
name = 'dang'
# 多页下载要注意 allowed_domains 范围,一般只写域名
allowed_domains = ['category.dangdang.com']
start_urls = ['http://category.dangdang.com/cp01.01.02.00.00.00.html']
base_url = 'http://category.dangdang.com/pg'
page = 1
def parse(self, response):
li_list = response.xpath('//ul[@id="component_59"]/li') # xpath 选择要爬取的内容路径
for li in li_list:
src = li.xpath('.//img/@data-original').extract_first()
# 懒加载反爬 第一张图片和其他图片的标签属性是不一样的,第一张图片是可以使用 src 的,其他图片的地址是 data-original
if src:
src = src
else:
src = li.xpath('.//img/@src').extract_first()
name = li.xpath('.//img/@alt').extract_first()
price = li.xpath('.//p[@class="price"]/span[1]/text()').extract_first()
book = ScrapyDangdangItem(src=src,name=name,price=price)
yield book # 获取一个 book 就将 book 交给 pipelines ,yield 类似 return
# 每一页的爬取逻辑是一样的。只需要将执行页的请求再次调用 parse 方法
if self.page < 100:
self.page = self.page + 1
url = self.base_url +str(self.page) + '-cp01.01.02.00.00.00.html' # 每页的url链接拼接
# callback 要执行的函数
yield scrapy.Request(url=url,callback=self.parse)3. items 定义数据结构
items.py
import scrapy
class ScrapyDangdangItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
src = scrapy.Field() # 图片
name = scrapy.Field() # 名字
price = scrapy.Field() # 价格4.管道 pipelines 下载数据
pipelines.py
import urllib.request
from itemadapter import ItemAdapter
# 如果想使用管道 ,必须在 settings 开启管道
class ScrapyDangdangPipeline:
# 在爬虫文件开始之前执行
def open_spider(self,spider):
self.fp = open('book.json','a',encoding='utf-8')
# item 就是yield 后面的 book 对象
def process_item(self, item, spider):
# write 方法必须是一个字符串
# 对文件打开关闭操作过于频繁,不推荐这样做
# with open('book.json','a',encoding='utf-8') as fp:
# fp.write(str(item))
self.fp.write(str(item) + ',')
return item
# 在爬虫文件执行完之后 执行
def cloxe_spider(self,spider):
self.fp.close()
# 再开一条管道下载
# 1)定义管道类,并在 settings 中增加 'scrapy_dangdang.pipelines.DangDangDownloadPipeline': 301,
class DangDangDownloadPipeline: # 定义管道类
def process_item(self,item,spider):
url = 'http:' + item.get('src') # 图片地址拼接
filename = r'C:\Users\Administrator\Desktop\books' + './' + item.get('name') + '.jpg'
urllib.request.urlretrieve(url=url,filename=filename) # 下载图片
return item5.爬取下载的部分数据保存在 json

6.保存的图片

边栏推荐
猜你喜欢

OpenGLES 学习之帧缓存

基于C语言的学生信息管理系统_(更新版)_(附源码和安装包)_课程设计_**往事随風**的博客
![Embedded system driver primary [3] - _IO model in character device driver foundation](/img/c7/21fc0651964a6a435e8ec5743b7662.png)
Embedded system driver primary [3] - _IO model in character device driver foundation

Unity表格配置编辑工具

word 公式编辑器 键入技巧 | 写数学作业必备速查表

【论文阅读笔记】无监督行人重识别中的采样策略

sql server如何得到本条记录与上一条记录的差异,即变动值

Unity Visual Effect Graph入门与实践

如何低成本修bug?测试左移给你答案

自动化测试的成本高效果差,那么自动化测试的意义在哪呢?
随机推荐
显式调用类的构造函数(而不是用赋值构造),实现一个new操作
8.03 Day34---BaseMapper查询语句用法
9. Dynamic SQL
thymeleaf中onclick事件动态传递参数问题
大龄程序员的心理建设
败给“MySQL”的第60天,我重振旗鼓,四面拿下蚂蚁金服offer
心余力绌:企业面临的软件供应链安全困境
JS basics - forced type conversion (error-prone, self-use)
7.16 Day22---MYSQL(Dao模式封装JDBC)
FLV格式详解
跨域问题的解决
文献管理工具 | Zotero
lambda函数用法总结
关于C#的反射,你真的运用自如嘛?
部署LVS-DR群集【实验】
渗透测试(PenTest)基础指南
4.1 声明式事务之JdbcTemplate
3面头条,花7天整理了面试题和学习笔记,已正式入职半个月
sql server如何得到本条记录与上一条记录的差异,即变动值
去重的几种方式