scrapy学习

本文介绍了Scrapy的安装、项目创建、爬取数据、常用命令、Response与Requests对象以及如何避免被禁止。通过示例展示了如何创建Scrapy项目,使用不同命令,并利用user_agent伪装爬虫。
摘要由CSDN通过智能技术生成

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作为请求报头发送给服务器。

伪装成浏览器是最简单的一种反爬虫方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值