本文通过一个简单的项目实现Scrapy采集流程。希望通过该项目对Scrapy的使用方法和框架能够有帮助。
1. 工作流程
重点流程如下:
- 创建一个Scrapy项目。
- 创建一个爬虫来抓取网站和处理数据。
- 通过命令行将采集的内容进行分析。
- 将分析的数据保存到MongoDB数据库。
2. 准备环境
安装好Scrapy框架,MongoDB的和PyMongo库。
3. 爬虫项目实现
(1)创建一个Scrapy项目,文件项目可以直接用
scrapy
命令生成,命令如下所示:
scrapy startproject教程复制代码
(2)爬虫是自己定义的类,Scrapy通过该类从网页里采集内容分析数据的结果。不过这个类必须继承Scrapy提供的蜘蛛类
scrapy.Spider
,还要定义爬虫的名称和起始请求,以及怎样处理爬取后的数据。
也可以使用命令行创建一个蜘蛛比如要生成行情这个蜘蛛,可以执行如下命令:
scrapy genspider 复制代码
进入刚才创建的教程文件夹,执行然后
genspider
命令。第一个参数是爬虫的名称,第二个参数是网站域名。执行完毕之后,蜘蛛文件夹中多了一个quotes.py,它就是刚刚创建的蜘蛛,内容如下所示
import scrapy
class QuotesSpider (scrapy.Spider):
name = “quotes”
allowed_domains = [ “quotes.toscrape.com” ]
start_urls = [ 'http://quotes.toscrape.com/' ]
def parse (self,response):
通过复制代码
(3)采集过程中,目标网站会限制爬虫的请求访问频率,必须使用爬虫代理
在项目中新建middlewares.py文件(./项目名/middlewares.py)
#! -*- encoding:utf-8 -*-
import base64
import sys
import random
PY3 = sys.version_info[0] >= 3
def base64ify(bytes_or_str):
if PY3 and isinstance(bytes_or_str, str):
input_bytes = bytes_or_str.encode('utf8')
else:
input_bytes = bytes_or_str
output_bytes = base64.urlsafe_b64encode(input_bytes)
if PY3:
return output_bytes.decode('ascii')
else:
return output_bytes
class ProxyMiddleware(object):
def process_request(self, request, spider):
# 代理服务器(产品官网 www.16yun.cn)
proxyHost = "t.16yun.cn"
proxyPort = "31111"
# 代理验证信息
proxyUser = "username"
proxyPass = "password"
request.meta['proxy'] = "http://{0}:{1}".format(proxyHost,proxyPort)
# 添加验证头
encoded_user_pass = base64ify(proxyUser + ":" + proxyPass)
request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
# 设置IP切换头(根据需求)
tunnel = random.randint(1,10000)
request.headers['Proxy-Tunnel'] = str(tunnel)
修改项目配置文件 (./项目名/settings.py)
DOWNLOADER_MIDDLEWARES = {
'项目名.middlewares.ProxyMiddleware': 100,
}