当前位置:网站首页>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 item
5.爬取下载的部分数据保存在 json
6.保存的图片
边栏推荐
猜你喜欢
word 公式编辑器 键入技巧 | 写数学作业必备速查表
MySQL日志篇,MySQL日志之binlog日志,binlog日志详解
The cost of automated testing is high and the effect is poor, so what is the significance of automated testing?
如何低成本修bug?测试左移给你答案
谷粒商城-基础篇(项目简介&项目搭建)
部署LVS-DR群集【实验】
ORACLE LINUX 6.5 安装重启后Kernel panic - not syncing : Fatal exception
擎朗智能全国研发创新中心落地光谷:去年曾获2亿美元融资
4.3 Annotation-based declarative transactions and XML-based declarative transactions
Cannot read properties of null (reading 'insertBefore')
随机推荐
7.15 Day21---MySQL----索引
4.2 声明式事务概念
OpenRefine中的正则表达式
Handling List
Unity动画生成工具
注意!软件供应链安全挑战持续升级
JS原型链
入坑软件测试的经验与建议
C1认证之web基础知识及习题——我的学习笔记
EntityComponentSystemSamples学习笔记
OpenCV获取和设置图像的平均亮度
webrtc中的视频编码(一) 视频编码模块轮廓
乱码解决方案
解决安装nbextensions后使用Jupyter Notebook时出现template_paths相关错误的问题
8大软件供应链攻击事件概述
Unity开发类似Profile那样的数据分析工具
【问题解决】同一机器上Flask部署TensorRT报错记录
利用Jenkins实现Unity自动化构建
LCP 17. Quick Calculation Robot
warning C4251: “std::vector&lt;_Ty&gt;”需要有 dll 接口由 class“Test”的客户端使用错误