Scrapy是一个十分强大的爬虫框架,依赖的库比较多,至少需要依赖的库有Twisted 14.0、lxml 3.4和pyOpenSSL 0.14。在不同的平台环境下,它所依赖的库也各不相同,所以在安装之前,最好确保把一些基本库安装好。
官方网站:https://scrapy.org
官方文档:https://docs.scrapy.org
PyPI:https://pypi.python.org/pypi/Scrapy
GitHub:https://github.com/scrapy/scrapy
中文文档:http://scrapy-chs.readthedocs.io
一、安装Scrapy
如果你的Python是使用Anaconda安装的
conda install Scrapy
Windows下的安装
下载安装pyOpenSSL https://pypi.python.org/pypi/pyOpenSSL#downloads
下载安装Twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
下载安装PyWin32 https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/
pip3 install Scrapy
CentOS和Red Hat
sudo yum groupinstall -y development tools
sudo yum install -y epel-release libxslt-devel libxml2-devel openssl-devel
pip3 install Scrapy
Ubuntu、Debian和Deepin
sudo apt-get install build-essential python3-dev libssl-dev libffi-dev libxml2 libxml2-dev libxslt1-dev zlib1g-dev
pip3 install Scrapy
二、scrapy 的使用
1、’创建项目
下面的命令可以创建一个Scrapy爬虫项目,它为我们规定了标准的项目格式。
scrapy startproject myproject [project_dir] #可以直接添加路径,也可以去你的工作目录省略路径选项
创建后用ide工具打开,项目结构:spiders模块中放置所有爬虫,scrapy.cfg是项目的全局配置文件,其余文件是Scrapy的组件。
2、创建爬虫
使用下面的命令可以创建一个爬虫,爬虫会放置在spider模块中。
scrapy genspider mydomain mydomain.com #需要进入项目目录,后面是爬虫名字和起始页面
下面代码是生成的爬虫具有基本的结构,我们也可以自己在此基础上编写代码。
# -*- coding: utf-8 -*-
import scrapy
class MydomainSpider(scrapy.Spider):
name = "mydomain"
allowed_domains = ["mydomain.com"]
start_urls = ['http://mydomain.com/']
def parse(self, response):
pass
爬虫起启动后会将start_urls中的网址交给一个start-requests的函数执行,然后返回一个response给parse函数,接下来就是自己写了。
如果起始页面是有多个,可以直接写到start_urls中,还可以重写start-requests函数,自己将网址写好后requests提交一个response交给parse,比如很多的网站的多个栏目页面的网址是固定的,就可以少请求一次,少分析一次网页。
3、IDE默认没有scrapy项目,为了方便调试,我们需要新建一个脚本来执行scrapy项目,在项目的目录下新建一个xxx.py的文件,一般我们取名main,或者run,里面写上下面代码,我们的项目就可以在Ide调试了。
from scrapy.cmdline import execute execute(['scrapy', 'crawl', 'mydomain']) #mydomain是爬虫的名字
4、防反爬虫,你懂得。不管网站有没有反爬,这一步最好都做,特别是需要长期爬的网站,也是对网站基本的尊重。这里主要是user-agent,和代理ip和cookie。
user-agent:可以自己写一个列表循环随机取,也可以安装一个包pip3 install fake-useragent,middlewares.py添加
from fake_useragent import UserAgent #这是一个随机UserAgent的包,里面有很多UserAgent class RandomUserAgentMiddleware(object): def process_request(self, request, spider): ua = UserAgent() request.headers.setdefault('User-Agent', ua.random) #这样就是实现了User-Agent的随即变换
settings.py的DOWNLOADER_MIDDLEWARES添加两条
DOWNLOADER_MIDDLEWARES = {
'lianjia.middlewares.RandomUserAgentMiddleware': 543,
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None, #这里要设置原来的scrapy的useragent为None,否者会被覆盖掉
}
代理ip,很重要,可以用免费的,可以买,也可以自建,middlewares.py添加
class RandomProxyMiddleware(object): '''动态设置ip代理''' def process_request(self,request,spider): get_ip = ip #ip为你的代理ip request.meta["proxy"] = "http://" + get_ip + ':端口' #你的代理方式,ip地址和端口
settings.py的DOWNLOADER_MIDDLEWARES添加一条
DOWNLOADER_MIDDLEWARES = { 'lianjia.middlewares.RandomProxyMiddleware': 542, #代理ip }
cookie:如果需要使用的,请使用cookie池,如果不需要就关了,settings.py里面
COOKIES_ENABLED = False
还有一点就是爬取过程中的sleep时间最好不要是固定的,比如0-5秒,随机的。