当前位置:网站首页>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.保存的图片
边栏推荐
- 入坑软件测试的经验与建议
- Sublime Text 3 2021.8.3 个人配置
- 12、分页插件
- The cost of automated testing is high and the effect is poor, so what is the significance of automated testing?
- 4.1 JdbcTemplate for declarative transactions
- DP4398:国产兼容替代CS4398立体声24位/192kHz音频解码芯片
- MySQL日期函数
- 【Matlab仿真】:一带电量为q的电荷以速度v运动,求运动电荷产生磁感应强度
- EventBus源码分析
- Swoole学习(一)
猜你喜欢
7.13 Day20----MYSQL
Cannot read properties of null (reading 'insertBefore')
败给“MySQL”的第60天,我重振旗鼓,四面拿下蚂蚁金服offer
canal实现mysql数据同步
npm安装依赖报错npm ERR! code ENOTFOUNDnpm ERR! syscall getaddrinfonpm ERR! errno ENOTFOUND
webrtc中的任务队列TaskQueue
Linux环境下redis的下载、安装和启动(建议收藏)
MySQL日志篇,MySQL日志之binlog日志,binlog日志详解
TSF微服务治理实战系列(一)——治理蓝图
程序员也应了解的Unity粒子系统
随机推荐
利用Jenkins实现Unity自动化构建
音视频相关基础知识与FFmpeg介绍
7.16 Day22---MYSQL (Dao mode encapsulates JDBC)
7.18 Day23----标记语言
想好了吗?
程序员的财富观
Programming hodgepodge (4)
企业需要知道的5个 IAM 最佳实践
MySql数据恢复方法个人总结
Embedded system driver primary [4] - under the basis of character device driver _ concurrency control
[原创]STL容器map和unordered_map性能,创建,插入,随机访问速度对比!
【JS】js给对象动态添加、设置、删除属性名和属性值
嵌入式系统驱动初级【4】——字符设备驱动基础下_并发控制
4.3 Annotation-based declarative transactions and XML-based declarative transactions
The string class introduction
8.03 Day34---BaseMapper query statement usage
【论文阅读笔记】无监督行人重识别中的采样策略
注意!软件供应链安全挑战持续升级
Several ways to heavy
C语言 -- 操作符详解