目录
1:Scarpy
(1) Scrapy是什么:
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理 或存储历史数据等一系列的程序中。
(2)安装scrapy:
pip install scrapy
2.scrapy项目的创建以及运行
1.创建scrapy项目:
终端输入 scrapy startproject 项目名
2.项目组成:
spiders __init__.py 自定义的爬虫文件.py ‐‐‐》由我们自己创建,是实现爬虫核心功能的文件 __init__.py items.py ‐‐‐》定义数据结构的地方,是一个继承自scrapy.Item的类 middlewares.py ‐‐‐》中间件 代理 pipelines.py ‐‐‐》管道文件,里面只有一个类,用于处理下载数据的后续处理 默认是300优先级,值越小优先级越高(1‐1000 ) settings.py ‐‐‐》配置文件 比如:是否遵守robots协议, User‐Agent 定义等3.创建爬虫文件
a: 跳转到spiders文件夹 cd 目录名字 /目录名字 /spiders b: scrapy genspider 爬虫名字 网页的域名4.爬虫文件的基本组成:
继承scrapy . Spider 类 name = 'baidu' ‐‐‐ 》 运行爬虫文件时使用的名字 allowed_domains ‐‐‐ 》 爬虫允许的域名,在爬取的时候,如果不是此域名之下的 url,会被过滤掉 start_urls ‐‐‐ 》 声明了爬虫的起始地址,可以写多个 url ,一般是一个 parse ( self , response ) ‐‐‐ 》解析数据的回调函数 response . text ‐‐‐ 》响应的是字符串 response . body ‐‐‐ 》响应的是二进制文件 response . xpath () ‐ 》 xpath 方法的返回值类型是 selector 列表 extract () ‐‐‐ 》提取的是 selector 对象的是 data extract_first () ‐‐‐ 》提取的是 selector 列表中的第一个数据5.运行爬虫文件:
scrapy crawl 爬虫名称 注意:应在spiders文件夹内执行3.scrapy工作原理
3.yield
1. 带有 yield 的函数不再是一个普通函数,而是一个生成器 generator ,可用于迭代 2. yield 是一个类似 return 的关键字,迭代一次遇到 yield 时就返回 yield 后面 ( 右边 ) 的值。重点是:下一次迭代 时,从上一次迭代遇到的yield 后面的代码 ( 下一行 ) 开始执行4.爬取当当网案例
1:项目结构
2:dang.py文件
import scrapy
from dangdang.items import DangdangItem
class DangSpider(scrapy.Spider):
name = 'dang'
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):
# src = //ul[@id="component_59"]/li//a/img/@src
# name = //ul[@id="component_59"]/li//a/img/@alt
# price = //ul[@id="component_59"]/li//p[@class="price"]/span[1]/text()
print("========================================")
li_list = response.xpath('//ul[@id="component_59"]/li')
for li in li_list:
# 首张图片使用@src,其他图片使用@data-original
src = li.xpath('.//a/img/@data-original').extract_first()
if src:
src = src
else:
src = li.xpath('.//a/img/@src').extract_first()
name = li.xpath('.//a/img/@alt').extract_first()
price = li.xpath('.//p[@class="price"]/span[1]/text()').extract_first()
print(src,name,price)
book = DangdangItem(src=src,name=name,price=price)
yield book
if self.page<100:
self.page =self.page+1
url =self.base_url + str(self.page) + '-cp01.01.02.00.00.00.html'
# scrapy的get请求
yield scrapy.Request(url=url,callback=self.parse)
2.items文件
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class DangdangItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
src = scrapy.Field() # 图片
name = scrapy.Field() # 名字
price = scrapy.Field() # 价格
3.pipelines文件
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class DangdangPipeline:
# Before
def open_spider(self,spider):
self.f = open('book.json','w',encoding='utf-8')
# After
def close_spider(self,spider):
self.f.close()
# item 就是 yield返回的book
def process_item(self, item, spider):
# write必须是字符串
self.f.write(str(item))
return item
import urllib.request
# 'dangdang.pipelines.DangdangDownloadPipeline': 301, 需要在setting中开启
class DangdangDownloadPipeline:
# item 就是 yield返回的book
def process_item(self, item, spider):
url = 'http:'+item.get('src')
# 需提前建立文件夹books
filename = './books/' + item.get('name') + '.jpg'
urllib.request.urlretrieve(url=url,filename=filename)
return item
5运行截图