pip install scrapy -i https://pypi.douban.com/simple
1、创建爬虫项目 打开cmd 输入scrapy startproject 项目的名字
注意:项目的名字不允许使用数字开头 也不能包含中文
2、创建爬虫文件 要在spiders文件夹中去创建爬虫文件
cd 项目的名字\项目的名字\spiders
cd scrapy_baidu_091\scrapy_baidu_091\spiders创建爬虫文件
scrapy genspider 爬虫文件的名字 要爬取网页
e.g.scrapy genspider baidu www.baidu.com
不需要添加http协议 因为start_urls的值是根据allowed_domains修改的
所以添加了http的话,那么start_urls就需要我们手动去修改
3、运行爬虫代码
scrapy crawl 爬虫名字
e.g.
scrapy crawl baidu
scrapy项目的结构
项目名字
项目名字
spiders文件夹(存储的是爬虫文件)
__init__
自定义的爬虫文件 核心功能文件
__init__
items 定义数据结构的地方
middlewares 中间件 代理
pipelines 管道 用来处理下载的数据
settings 配置文件 robots协议 user-agent定义等
response.text 获取响应的字符串
response.body 获取二进制数据
response.url 获取请求路径
response.status 获取状态码
response.xpath 解析response中的内容,返回一个selector列表对象
response.css 使用css_selector查询元素,返回一个selector对象
response.extract() 提取seletor对象的data属性
response.extract_first() 提取seletor列表的第一个数据
会自动组织所有的请求对象,分发给下载器
从引擎处获取到请求对象后,请求数据
定义爬取动作和解析网页
无需关注
处理数据的管道,会预留接口用来处理数据
Scrapy shell是Scrapy框架提供的一个交互式shell工具,用于快速开发和调试爬虫。它允许用户在不启动完整爬虫程序的情况下,以交互的方式加载和请求网页,并使用选择器和Scrapy的API来提取和处理数据。
在命令行窗口,输入pip install ipython
在命令行窗口输入,scrapy shell www.baidu.com
然后就可以直接在命令行窗口用response方法
import scrapy
from scrapy_dangdang_096.items import ScrapyDangdang096Item
class DangSpider(scrapy.Spider):
name = "dang"
allowed_domains = ["category.dangdang.com"]
start_urls = ["https://category.dangdang.com/cp01.54.92.01.00.00.html"]
base_url = 'https://category.dangdang.com/pg'
page = 1
def parse(self, response):
# src = response.xpath('//ul[@id="component_59"]/li//img/@src')
#
# name = response.xpath('//ul[@id="component_59"]/li//img/@alt')
#
# price = response.xpath('//ul[@id="component_59"]/li//p[@class="price"]/span[1]')
li_list = response.xpath('//ul[@id="component_59"]/li')
#所有的selector对象都可以再次调用xpath
for li in li_list:
src = li.xpath('.//img/@data-original').extract_first()
#第一张图片和其他图片的标签的属性是不一样的
#第一张图片可以用src,其他图片的地址标签是data—original
if src!=None:
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 = ScrapyDangdang096Item(src = src,name=name,price=price)
#获取一个book就将book交给pipelines
yield book
#https://category.dangdang.com/cp01.54.92.01.00.00.html
#https://category.dangdang.com/pg2-cp01.54.92.01.00.00.html
#https://category.dangdang.com/pg3-cp01.54.92.01.00.00.html
if self.page<100:
self.page=self.page+1
url = self.base_url + str(self.page) + '-cp01.54.92.01.00.00.html'
#怎么去调用parse方法
#scrapy.Request就是scrapy的get请求
#url就是请求地址
#callback是你要执行的那个函数 注意不需要加()
yield scrapy.Request(url = url,callback = self.parse)
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class ScrapyDangdang096Item(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
#图片
src = scrapy.Field()
#名字
name = scrapy.Field()
#价格
price = scrapy.Field()
import urllib.request
#如果想使用pipelines,就要先在settings中打开pipelines
class ScrapyDangdang096Pipeline:
#在爬虫文件开始之前执行
def open_spider(self,spider):
self.fp = open('book.json','w',encoding='utf-8')
# item就是yield后面的对象
def process_item(self, item, spider):
self.fp.write(str(item))
#(1)write 方法必须写字符串
#(2)a模式是追加写
# with open('book.json','a',encoding='utf-8') as fp:
# fp.write(str(item))
return item
def close_spider(self,spider):
self.fp.close()
#多条管道开启
#(1)定义管道类
#(2)在settings中开启管道
#将'scrapy_dangdang_096.pipelines.DangDangDownloadPipeline':301写入pipelines.py文件
class DangDangDownloadPipeline:
def process_item(self,item,spider):
url = 'http:'+item.get('src')
filename = './books'+item.get('name')+'.jpg'
urllib.request.urlretrieve(url=url,filename=filename)
return item
这个文件里取消 ITEM_PIPELINES 的注释,即开启pipeline。
然后在字典中加入
#DangDangDownloadPipeline
'scrapy_dangdang_096.pipelines.DangDangDownloadPipeline':301
,即开启多条pipeline。
总而言之:
ITEM_PIPELINES = {
#pipelines可以有多个,管道是有优先级的,优先级的范围是1到1000,且值越小优先级越高
"scrapy_dangdang_096.pipelines.ScrapyDangdang096Pipeline": 300,
#DangDangDownloadPipeline
'scrapy_dangdang_096.pipelines.DangDangDownloadPipeline':301
}