爬虫— scrapy 的基本使用
程序员文章站
2022-11-05 20:13:52
以 quotes.toscrape.com 为例一、创建项目startproject 项目名cd 项目名scrapy genspider 爬虫名 爬虫网站【爬虫名 != 爬虫网站】startproject examplecd examplescrapy genspider quotes quotes.toscrape.com注意,区分项目目录【项目名】,工作目录【默认和项目名一样】,爬虫目录【默认是spiders】:scrapy.cfg是项目 配置 文件,在项目目录下,其中定义了....
以 quotes.toscrape.com 为例
一、创建项目
startproject 项目名
cd 项目名
scrapy genspider 爬虫名 爬虫网站
【爬虫名 != 爬虫网站】
startproject example
cd example
scrapy genspider quotes quotes.toscrape.com
注意,区分项目目录
【项目名】,工作目录
【默认和项目名一样】,爬虫目录
【默认是spiders
】:
-
scrapy.cfg
是项目配置
文件,在项目目录
下,其中定义了工作目录
和项目设置文件
的路径 -
settings.py
是默认的项目设置
文件,默认在工作目录
下,其中定义了爬虫目录
和的路径 - 用
pycharm
写代码时要将工作目录
标记为根目录 - 命令行工作时应该在
项目目录下
二、编写项目
1、items.py
字段记录
每条数据分别为名言text
, 作者author
, 标签tags
import scrapy
class ExampleItem(scrapy.Item):
# 这个文件用来记录数据的字段
text = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()
2、quotes.py
爬虫文件
import scrapy
from items import ExampleItem
class QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
quotes = response.xpath("//div[@class='quote']") # 也支持 .css 选择器
for quote in quotes:
# 和平时的[0]直接提取文本不同,其用 .get() 来提取数据
text = quote.xpath(".//span[@class='text']/text()").get()
author = quote.xpath(".//small[@class='author']/text()").get()
tags = quote.xpath(".//a[@class='tag']/text()").getall()
item = ExampleItem()
item['text'] = text
item['author'] = author
item['tags'] = tags
yield item
next = response.xpath("//li[@class='next']/a/@href").get()
url = response.urljoin(next) # 拼接网址
yield scrapy.Request(url=url, callback=self.parse) # 回调自己实现翻页
3、pipelines.py
项目管道
对数据的筛选和存储可以在这里完成
注意:
- 管道类的方法有明确的执行顺序和需要的参数以及执行次数,需要记忆
- 管道中的
process_item()
一定要返回一个对象,别TM把return
的位置写错了,然后调试半天!
import pymongo
from scrapy.exceptions import DropItem
class ExamplePipeline:
def __init__(self):
self.limit = 50
def process_item(self, item, spider):
if item['text']:
if len(item['text']) > self.limit:
# 将超过 limit 的部分替换
item['text'] = item['text'][0:self.limit].rstrip() + '...'
return item
else:
return DropItem('Missing Text')
class MongoPipeline:
def __init__(self, mongo_uri, mongo_db):
# 2、初始化方法其次执行, 初始化类变量
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
# 1、类方法最先执行, 从项目设置文件中获取字段数据, 交给初始化方法
return cls(
mongo_uri = crawler.settings.get('MONGO_URI'),
mongo_db = crawler.settings.get('MONGO_DB')
)
def open_spider(self, spider):
# 3、爬虫启动时执行的操作,在初始化完成之后执行
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def process_item(self, item, spider):
# 4、获取到数据后执行
name = item.__class__.__name__
self.db[name].insert(dict(item))
return item
def close_spider(self, spider):
# 5、爬虫关闭后执行
self.client.close()
上面写了两个管道,写完管道的类后需要在设置文件中安排管道的优先顺序才能启用管道
4、settings.py
设置文件
序号越小,顺序越高
MONGO_URI = 'localhost'
MONGO_DB = 'quotes'
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,
'example.pipelines.MongoPipeline': 400,
}
三、其他常用操作
1、命令行启动
scrapy crawl 爬虫文件名
【 --nolog
可以不打印日志】
scrapy crawl quotes
2、制作启动器
在项目目录下新建start.py
,每次运行这个即可
from scrapy import cmdline
cmd = "scrapy crawl quotes --nolog"
cmdline.execute(cmd.split())
3、shell
交互模式
scrapy shell 网址
scrapy shell http://quotes.toscrape.com/
4、打开页面
scrapy view 网址
获取没有加载js
的页面
scrapy view http://quotes.toscrape.com/
5、保存数据
scrapy crawl 爬虫文件名 -o 文件名
默认是保存在项目目录下,支持多种格式:‘json’, ‘jsonlines’, ‘jl’, ‘csv’, ‘xml’, ‘marshal’, ‘pickle’
scrapy crawl quotes -o quotes.json
甚至支持ftp
远程保存
本文地址:https://blog.csdn.net/qq_41205771/article/details/107438531