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() 方法。
/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腳本