前面介紹了不少Selenium基於自動測試的Python爬蟲程序,主要利用它的xpath語句,經過分析網頁DOM樹結構進行爬取內容,同時能夠結合Phantomjs模擬瀏覽器進行鼠標或鍵盤操做。可是,更爲普遍使用的Python爬蟲框架是——Scrapy爬蟲。這是一篇在Windows系統下介紹 Scrapy爬蟲安裝及入門介紹的相關文章。php
官方 Scrapy :http://scrapy.org/
官方英文文檔:http://doc.scrapy.org/en/latest/index.html
官方中文文檔:https://scrapy-chs.readthedocs.org/zh_CN/0.24/index.html
css
本文主要講述Windows下的安裝過程,首先個人Python是2.7.8版本。
主要經過Python的PIP語句進行安裝:html
pip install scrapy
安裝PIP參考:http://blog.csdn.net/eastmount/article/details/47785123
經過 pip list outdated 命令查看軟件最新版本,表示PIP安裝成功。
python
而後,輸入 pip install scrapy 命令進行安裝。
git
安裝成功後,經過cmd調用 scrapy 指令查看,表示安裝成功。
github
若是過程當中存在以下圖所示錯誤"no module named win32api",則須要下載安裝win32,選擇2.7.8版本。地址爲:http://sourceforge.net/projects/pywin32/files/
web
此時,scrapy安裝成功,能夠進行第二步"第一個scrapy爬蟲實現"了~
數據庫
正如xifeijian大神所說:「做爲Python愛好者,若是不知道easy_install或者pip中的任何一個的話,那麼......」。easy_insall的做用和perl中的cpan,ruby中的gem相似,都提供了在線一鍵安裝模塊的傻瓜方便方式,而pip是easy_install的改進版,提供更好的提示信息,刪除package等功能。老版本的python中只有easy_install,沒有pip。常見的具體用法以下:
編程
easy_install的用法: 1) 安裝一個包 $ easy_install <package_name> $ easy_install "<package_name>==<version>" 2) 升級一個包 $ easy_install -U "<package_name>>=<version>" pip的用法 1) 安裝一個包 $ pip install <package_name> $ pip install <package_name>==<version> 2) 升級一個包 (若是不提供version號,升級到最新版本) $ pip install --upgrade <package_name>>=<version> 3)刪除一個包 $ pip uninstall <package_name>
官網介紹:
Scrapy是一個爲了爬取網站數據,提取結構性數據而編寫的應用框架。能夠應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。其最初是爲了 頁面抓取 (更確切來講, 網絡抓取 )所設計的, 也能夠應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。
An open source and collaborative framework for extracting the data you need from websites. In a fast, simple, yet extensible way.
下面是參考官網在windows下實現的第一個scrapy爬蟲程序:
json
打開Python IDLE,建立myspider.py文件,代碼以下:
1 import scrapy 2 3 class BlogSpider(scrapy.Spider): 4 name = 'blogspider' 5 start_urls = ['http://blog.scrapinghub.com'] 6 7 def parse(self, response): 8 for url in response.css('ul li a::attr("href")').re(r'.*/\d\d\d\d/\d\d/$'): 9 yield scrapy.Request(response.urljoin(url), self.parse_titles) 10 11 def parse_titles(self, response): 12 for post_title in response.css('div.entries > ul > li a::text').extract(): 13 yield {'title': post_title}
若是此時你試圖點擊Run運行程序或在IDLE中輸入 scrapy runspider myspider.py,彷佛返回以下錯誤:
此時我懷疑Windows下須要調用cmd運行程序,仍是強烈推薦在Linux下學習使用Python相關編程知識。調用cd去到文件所在目錄:
cd G:\software\Program software\Python\python insert\scrapy project
而後在運行程序,結果輸出以下所示:
此時,程序可以運行成功了,不論結果如何、代碼如何,總算在Windows下跑起來了。下面第三部分,我再簡單介紹如何調用Scrapy爬蟲進行一個入門相關的爬取~
入門介紹參考:初窺Scrapy 和 Scrapy入門教程
給你們簡單舉個例子,使用maxliaops的Scrapy爬蟲爬取騰訊的職位招聘信息。
代碼下載:https://github.com/maxliaops/scrapy-itzhaopin
源文連接:http://blog.csdn.net/HanTangSongMing/article/details/24454453
目標網址爲:http://hr.tencent.com/position.php
Windows下Ctrl+R調用CMD命令行。輸入命令以下:
1.chcp 936 unknown encoding: cp65001異常時,須要將編碼(UTF-8)修改成 簡體中文(GBK) 2.cd G:\software\Program software\Python\python insert\scrapy project 去到安裝Scrapy目錄下 3.cd scrapy-itzhaopin-master\itzhaopin 再次去到下載的文件itzhaopin目錄下 4.scrapy crawl tencent 運行代碼啓動這個Spider,進行下載
最後運行會在scrapy-itzhaopin-master\itzhaopin文件夾下生產一個tencent.json的結果。數據量很大,下圖只展現部分日期是2015-11-07的數據,以下所示:
其中代碼itzhaopin項目的結果圖以下所示:參考原文做者博客
├── itzhaopin │ ├── itzhaopin │ │ ├── __init__.py │ │ ├── items.py │ │ ├── pipelines.py │ │ ├── settings.py │ │ └── spiders │ │ └── __init__.py │ └── scrapy.cfg scrapy.cfg: 項目配置文件 items.py: 須要提取的數據結構定義文件 pipelines.py:管道定義,用來對items裏面提取的數據作進一步處理,如保存等 settings.py: 爬蟲配置文件 spiders: 放置spider的目錄
核心的幾個py文件內容以下,詳見github:
1.items.py:定義咱們要抓取的數據
1 # Define here the models for your scraped items 2 # 3 # See documentation in: 4 # http://doc.scrapy.org/en/latest/topics/items.html 5 6 from scrapy.item import Item, Field 7 class TencentItem(Item): 8 name = Field() # 職位名稱 9 catalog = Field() # 職位類別 10 workLocation = Field() # 工做地點 11 recruitNumber = Field() # 招聘人數 12 detailLink = Field() # 職位詳情頁連接 13 publishTime = Field() # 發佈時間
2.spiders文件夾中tencent_spider.py文件:實現Spider
Spider是一個繼承自scrapy.contrib.spiders.CrawlSpider的Python類,有三個必需的定義的成員
name: 名字,這個spider的標識
start_urls:一個url列表,spider從這些網頁開始抓取
parse():一個方法,當start_urls裏面的網頁抓取下來以後須要調用這個方法解析網頁內容,同時須要返回下一個須要抓取的網頁,或者返回items列表
1 import re 2 import json 3 4 from scrapy.selector import Selector 5 try: 6 from scrapy.spider import Spider 7 except: 8 from scrapy.spider import BaseSpider as Spider 9 from scrapy.utils.response import get_base_url 10 from scrapy.utils.url import urljoin_rfc 11 from scrapy.contrib.spiders import CrawlSpider, Rule 12 from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor as sle 13 14 15 from itzhaopin.items import * 16 from itzhaopin.misc.log import * 17 18 19 class TencentSpider(CrawlSpider): 20 name = "tencent" 21 allowed_domains = ["tencent.com"] 22 start_urls = [ 23 "http://hr.tencent.com/position.php" 24 ] 25 rules = [ 26 Rule(sle(allow=("/position.php\?&start=\d{,4}#a")), follow=True, callback='parse_item') 27 ] 28 29 def parse_item(self, response): 30 items = [] 31 sel = Selector(response) 32 base_url = get_base_url(response) 33 sites_even = sel.css('table.tablelist tr.even') 34 for site in sites_even: 35 item = TencentItem() 36 item['name'] = site.css('.l.square a').xpath('text()').extract()[0] 37 relative_url = site.css('.l.square a').xpath('@href').extract()[0] 38 item['detailLink'] = urljoin_rfc(base_url, relative_url) 39 item['catalog'] = site.css('tr > td:nth-child(2)::text').extract()[0] 40 item['workLocation'] = site.css('tr > td:nth-child(4)::text').extract()[0] 41 item['recruitNumber'] = site.css('tr > td:nth-child(3)::text').extract()[0] 42 item['publishTime'] = site.css('tr > td:nth-child(5)::text').extract()[0] 43 items.append(item) 44 #print repr(item).decode("unicode-escape") + '\n' 45 46 sites_odd = sel.css('table.tablelist tr.odd') 47 for site in sites_odd: 48 item = TencentItem() 49 item['name'] = site.css('.l.square a').xpath('text()').extract()[0] 50 relative_url = site.css('.l.square a').xpath('@href').extract()[0] 51 item['detailLink'] = urljoin_rfc(base_url, relative_url) 52 item['catalog'] = site.css('tr > td:nth-child(2)::text').extract()[0] 53 item['workLocation'] = site.css('tr > td:nth-child(4)::text').extract()[0] 54 item['recruitNumber'] = site.css('tr > td:nth-child(3)::text').extract()[0] 55 item['publishTime'] = site.css('tr > td:nth-child(5)::text').extract()[0] 56 items.append(item) 57 #print repr(item).decode("unicode-escape") + '\n' 58 59 info('parsed ' + str(response)) 60 return items 61 62 63 def _process_request(self, request): 64 info('process ' + str(request)) 65 return request
3.pipelines.py:實現PipeLine
PipeLine用來對Spider返回的Item列表進行保存操做,能夠寫入到文件、或者數據庫等。PipeLine只有一個須要實現的方法:process_item,例如咱們將Item保存到JSON格式文件中:
1 # Define your item pipelines here 2 # 3 # Don't forget to add your pipeline to the ITEM_PIPELINES setting 4 # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html 5 6 from scrapy import signals 7 import json 8 import codecs 9 10 class JsonWithEncodingTencentPipeline(object): 11 12 def __init__(self): 13 self.file = codecs.open('tencent.json', 'w', encoding='utf-8') 14 15 def process_item(self, item, spider): 16 line = json.dumps(dict(item), ensure_ascii=False) + "\n" 17 self.file.write(line) 18 return item 19 20 def spider_closed(self, spider): 21 self.file.close( 22 )
4.settings.py:設置文件
1 # Scrapy settings for itzhaopin project 2 # 3 # For simplicity, this file contains only the most important settings by 4 # default. All the other settings are documented here: 5 # 6 # http://doc.scrapy.org/en/latest/topics/settings.html 7 # 8 9 BOT_NAME = 'itzhaopin' 10 11 SPIDER_MODULES = ['itzhaopin.spiders'] 12 NEWSPIDER_MODULE = 'itzhaopin.spiders' 13 14 # Crawl responsibly by identifying yourself (and your website) on the user-agent 15 #USER_AGENT = 'itzhaopin (+http://www.yourdomain.com)' 16 17 ITEM_PIPELINES = { 18 'itzhaopin.pipelines.JsonWithEncodingTencentPipeline': 300, 19 } 20 21 LOG_LEVEL = 'INFO'
看了這個簡單的例子後,後面的文章就會根據原文進行一些自定義的爬蟲實驗了,但願對你有所幫助吧~同時仍是感受Linux下學習這些更適合些。最後推薦兩篇文章:
Python爬蟲框架Scrapy實戰之定向批量獲取職位招聘信息
Scrapy研究探索專欄 做者:young-hz
[Python]網絡爬蟲(12):爬蟲框架Scrapy的第一個爬蟲示例入門教程
(By:Eastmount 2015-11-08 深夜4點 http://blog.csdn.net/eastmount/)