scrapy是一种基于Python的高性能爬虫框架。本文简单记录我学习scrapy的一些笔记。
scrapy 安装
scrapy需要Python 2.7 或者 Python 3.3+以上的开发环境。因此如果没有安装python环境的话,需要先在本机安装。Linux 一般自带环境,这里不详细说明。
sudo pip install scrapy
即可直接安装scrapy。
使用scrapy
创建scrapy 项目
scrapy安装完毕后,在命令行中输入
scrapy startproject tutorial
即可创建一个名叫tutorial的scrapy项目
tutorial/
scrapy.cfg # deploy configuration file
tutorial/ # project's Python module, you'll import your code from here
__init__.py
items.py # project items definition file
pipelines.py # project pipelines file
settings.py # project settings file
spiders/ # a directory where you'll later put your spiders
__init__.py
使用scrapy爬取数据
进入项目文件夹后,在tutorial/spiders目录下新建quotes_spider.py文件
vim tutorial/spiders/quotes_spider.py
并输入以下代码:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').extract_first(),
'author': quote.css('span small::text').extract_first(),
'tags': quote.css('div.tags a.tag::text').extract(),
}
next_page = response.css('li.next a::attr(href)').extract_first()
if next_page is not None:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse)
这里创建了一个蜘蛛,命名为quotes. 注意蜘蛛的命名应该是独一无二的。
start_urls 蜘蛛将会爬取的url列表
执行代码
scrapy crawl quotes -o quotes.json
代码运行后,会爬取页面上的数据,并根据要求解析出来,然后将得到的数据存储在quotes.json文件中。
可以使用cat 命令查看quotes.json文件内容。
cat quotes.json
scrapy一些命令
创建项目
创建一个scrapy项目,命名为tutorial.
scrapy startproject tutorial
创建一个新的“蜘蛛”
scrapy genspider mydomain mydomain.com
这样就会在spiders目录中新建一个mydomain.py文件,文件内容为
# -*- 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
帮助命令
scrapy -h
或者
scrapy <command> -h
打印项目中的“蜘蛛”
scrapy list
尝试连接到服务器
scrapy fetch <url>
这个命令展示scrapy如何连接到url的服务器上
shell命令
使用scrapy shell,可以方便的进行代码调试。
scrapy shell <url>
或者
scrapy shell <htmlpath>
进入shell 模式
Response 和 Requests
本节详细介绍scrapy中Response和Requests结构
Response object
scrapy在爬取一个页面之后,会返回一个Response object. 包含的内容如下:
- url spider爬取的url地址
- status 服务器返回的状态码
- headers
- body
- flags (不太明白)
- request
Requests object
requests 代表一个http请求,通常是由spider发起向服务器。
requests object 包含的内容如下:
- url
- callback
- method ‘GET’ , ‘POST’ or ‘PUT’
- body
- headers
- cookies
- encoding
- priority
- dont_filter
- errback
避免被禁止(ban)
- 使用user agent池,轮流选择之一来作为user agent。池中包含常见的浏览器的user agent(google一下一大堆)
- 禁止cookies(参考 COOKIES_ENABLED),有些站点会使用cookies来发现爬虫的轨迹。
- 设置下载延迟(2或更高)。参考 DOWNLOAD_DELAY 设置。
- 如果可行,使用 Google cache 来爬取数据,而不是直接访问站点。
- 使用IP池。例如免费的 Tor项目或付费服务(ProxyMesh)。
- 使用高度分布式的下载器(downloader)来绕过禁止(ban),您就只需要专注分析处理页面。这样的例子有: Crawlera
scrapy使用user_agent伪装
scrapy在请求的时候报头为scrapy自己的,有些服务器会限制访问,因此需要将spider伪装成浏览器再向服务器发送请求。
修改tutorial/middlewares.py,加入以下内容:
import random
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
class RotateUserAgentMiddleware(UserAgentMiddleware):
def __init__(self, user_agent=''):
self.user_agent = user_agent
def process_request(self, request, spider):
ua = random.choice(self.user_agent_list)
if ua:
print ua, '-------'
request.headers.setdefault('User-Agent', ua)
user_agent_list = [
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
]
修改tutorial/settings.py文件,添加下列代码
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
'tutorial.middlewares.RotateUserAgentMiddleware':400,
}
这样spider就会每次发送请求的时候,随机选择一个user_agent作为请求报头发送给服务器。
伪装成浏览器是最简单的一种反爬虫方法。