Scrapy 安装及基础操作
Scrapy 安装:
https://www.lfd.uci.edu/~gohlke/pythonlibs/ 各种whl安装依赖库文件
1 . wheel pip install wheel
2. lxml https://lxml.de/
3. PyOpenssl https://pypi.org/project/pyOpenSSL/ 或 pip install pyopenssl
Import OpenSSL
4.Twisted
Twisted是一个事件驱动型的网络引擎。由于事件驱动编程模型在Twisted的设计哲学中占有重要的地位,因此这里有必要花点时间来回顾一下究竟事件驱动意味着什么。
事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。另外两种常见的编程范式是(单线程)同步以及多线程编程。
5. Pywin32
6. scrapy pip install scrapy
创建项目
在开始爬取之前,您必须创建一个新的Scrapy项目。进入您打算存储代码的目录中,运行下列命令:
scrapy startproject tutorial
该命令将会创建包含下列内容的 tutorial 目录:
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
这些文件分别是:
scrapy.cfg: 项目的配置文件
tutorial/: 该项目的python模块。之后您将在此加入代码。
tutorial/items.py: 项目中的item文件.
tutorial/pipelines.py: 项目中的pipelines文件.
tutorial/settings.py: 项目的设置文件.
tutorial/spiders/: 放置spider代码的目录.
目标站点: 官方教程网站quotes.toscrape.com,这是一个列出着名作家引用的网站
实战:
- 创建项目 ,目录文件用运行窗口打开,输入scrapy startproject scrapy_23_tutorial
Pycharm打开项目 如下图,将项目 的根目录作为源根目录,在运行调用items时不会报错。项目文件夹会变蓝色。
- 在\scrapy_23_tutorial\scrapy_23_tutorial\spiders 下创建quotes.py
# -*- coding: utf-8 -*- import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" # 用于区别Spider,该名字必须是唯一的
# 包含了spider允许爬取的域名(domain)列表(list)
allowed_domains = ["quotes.toscrape.com"]
# 包含了Spider在启动时进行爬取的url列表。 第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。
start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
# parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。
# 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。
print(response.text)
运行项目:scrapy crawl quotes
- Items.Py 文件下
from scrapy import Field,Item
class Scrapy23TutorialItem(Item):
# define the fields for your item here like:
# name = scrapy.Field()
text = Field()
author = Field()
tags = Field()
- 爬取 名言并进行翻页。 Css 选择器
from scrapy_23_tutorial.items import Scrapy23TutorialItem
import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" # 用于区别Spider,该名字必须是唯一的 allowed_domains = ["quotes.toscrape.com"] start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
# parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。
# 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。
quotes = response.css('.quote')
for quote in quotes:
item = Scrapy23TutorialItem() #
text = quote.css('.text::text').extract_first() # 获取.text 内的text文本内容
author = quote.css('.author::text').extract_first()
tags = quote.css('.tags .tag::text').extract()
item['text']=text
item['author'] = author
item['tags'] = tags
yield item
next = response.css('.col-md-8 .pager .next a::attr(href)').extract_first()
url = response.urljoin(next) # 添加url 后部
yield scrapy.Request(url=url, callback=self.parse)
- 爬取的items数据 存储: scrapy crawl quotes -o 名字.存储类型后缀
4.1.命令行输入
D:\Py_scrapy\scrapy_23_tutorial>scrapy crawl quotes -o quotes.json
将生产 quotes.json 标准的json格式文件
4.2. scrapy crawl quotes -o quotes.jl
将生产 quotes.jl 单独一条数据包含一个item
4.3. scrapy crawl quotes -o quotes.csv
4.4. scrapy crawl quotes -o quotes.xml
等等…
- 存储items数据前进行处理
Pipelines.py 下
import pymongo
from scrapy.exceptions import DropItem
class TextPipeline(object):
def __init__(self):
self.limit = 50
def process_item(self, item, spider):
if item['text']:
if len(item['text']) > self.limit:
item['text'] = item['text'][0:self.limit].rstrip() + '...'
return item
else:
return DropItem("Missing Text")
class MongoPipeline(object):
def __init__(self,mongo_url , mongo_db):
self.mongo_url = mongo_url
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
return cls(
mongo_url=crawler.settings.get('MONGO_URL'),
mongo_db = crawler.settings.get('MONGO_DB')
)
def open_spider(self,spider):
self.client = pymongo.MongoClient(self.mongo_url)
self.db = self.client[self.mongo_db]
def process_item(self,item , spider):
name = item.__class__.__name__
self.db[name].insert(dict(item))
return item
def close_spider(self,spider):
self.client.close()
- 在setting.py 下
MONGO_URL = 'localhost'
MONGO_DB = 'scrapy_23_tutorial'
ITEM_PIPELINES = {
'scrapy_23_tutorial.pipelines.TextPipeline': 300,
'scrapy_23_tutorial.pipelines.MongoPipeline': 400
}
# Crawl