用 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腳本
相關文章
相關標籤/搜索