[Python爬蟲] scrapy爬蟲系列 <一>.安裝及入門介紹

        前面介紹了不少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爬蟲程序實現

        官網介紹:
        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 和 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/)

相關文章
相關標籤/搜索