用 scrapy 建立爬虫项目

 1 安装命令css

pip install Scrapy

2 建立项目: html

scrapy startproject tutorial

项目结构:python

tutorial/
    scrapy.cfg
    tutorial/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py

3 定义Item:Item 是保存爬取到的数据的容器ajax

import scrapy

class DmozItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()

4 Spider代码正则表达式

import scrapy

class DmozSpider(scrapy.Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]

    def parse(self, response):
        filename = response.url.split("/")[-2]
        with open(filename, 'wb') as f:
            f.write(response.body)

5 爬取命令 【能够查询日志的输出】django

scrapy crawl dmoz

原理解释:json

Scrapy为Spider的 start_urls 属性中的每一个URL建立了 scrapy.Request 对象,
并将 parse 方法做为回调函数(callback)赋值给了Request。

Request对象通过调度,执行生成 scrapy.http.Response 对象并送回给spider parse() 方法。

 

6 Selectors选择器简介

  • /html/head/title: 选择HTML文档中 <head> 标签内的 <title> 元素
  • /html/head/title/text(): 选择上面提到的 <title> 元素的文字
  • //td: 选择全部的 <td> 元素
  • //div[@class="mine"]: 选择全部具备 class="mine" 属性的 div 元素

Selector有四个基本的方法浏览器

  • xpath(): 传入xpath表达式,返回该表达式所对应的全部节点的selector list列表 。
  • css(): 传入CSS表达式,返回该表达式所对应的全部节点的selector list列表.
  • extract(): 序列化该节点为unicode字符串并返回list。
  • re(): 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。

 7 demo 实例bash

import scrapy

from tutorial.items import DmozItem

class DmozSpider(scrapy.Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]

    def parse(self, response):
        for sel in response.xpath('//ul/li'):
            item = DmozItem()
            item['title'] = sel.xpath('a/text()').extract()
            item['link'] = sel.xpath('a/@href').extract()
            item['desc'] = sel.xpath('text()').extract()
            yield item

8 使用Item Pipeline 保存数据app

在 settings.py 中设置 ITEM_PIPELINES,其默认为[],与 django 的 MIDDLEWARE_CLASSES 等类似。
从 Spider 的 parse 返回的 Item 数据将依次被 ITEM_PIPELINES 列表中的 Pipeline 类处理。

一个 Item Pipeline 类必须实现如下方法:

  • process_item(item, spider) 为每一个 item pipeline 组件调用,而且须要返回一个 scrapy.item.Item 实例对象或者抛出一个 scrapy.exceptions.DropItem 异常。当抛出异常后该 item 将不会被以后的 pipeline 处理。参数:
    • item (Item object) – 由 parse 方法返回的 Item 对象
    • spider (BaseSpider object) – 抓取到这个 Item 对象对应的爬虫对象

也可额外的实现如下两个方法:

  • open_spider(spider) 当爬虫打开以后被调用。参数: spider (BaseSpider object) – 已经运行的爬虫
  • close_spider(spider) 当爬虫关闭以后被调用。参数: spider (BaseSpider object) – 已经关闭的爬虫

9 使用Feed exports保存数据:

scrapy crawl dmoz -o items.json

tips: ITEM_PIPELINES 为空 才能保存到本地

 

拓展: 用django的debug模式启动 须要本身配置脚本manage.py:
 

#-*-coding:utf-8 -*-
#经过调用命令行进行调试

__author__ = "james"
__date__ = "2017/11/9 14:41"
#调用execute这个函数可调用scrapy脚本
from scrapy.cmdline import execute

#设置工程命令
import sys
import os
#设置工程路径,在cmd 命令更改路径而执行scrapy命令调试
#获取main文件的父目录,os.path.abspath(__file__) 为__file__文件目录

sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(["scrapy", "crawl", {spider_name}])

同时运行多个爬虫的脚本:
manage.py

from spiders.mydomain import MydomainSpider
from spiders.steam_spider import SteamSpider
from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerProcess
process = CrawlerProcess(get_project_settings())
process.crawl(SteamSpider)
process.crawl(MydomainSpider)
process.start()

参考:http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html

 

拓展:

反爬虫 方法:
  1 检测用户行为,例如同一IP短期内屡次访问同一页面,或者同一帐户短期内屡次进行相同操做。
    破解方法:能够专门写一个爬虫,爬取网上公开的代理ip,检测后所有保存起来。
            这样的代理ip爬虫常常会用到,最好本身准备一个。有了大量代理ip后能够每请求几回更换一个ip

 2 动态页面 数据是经过ajax请求获得,或者经过JavaScript生成的  参数通过加密
   破解方法:selenium+phantomJS 我用的是selenium+phantomJS框架,调用浏览器内核,
           并利用phantomJS执行js来模拟人为操做以及触发页面中的js脚本
相关文章
相关标签/搜索