目录
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运行截图