[Python爬虫] scrapy爬虫系列 一.安装及入门介绍
? ? ? ? 前面介紹了很多Selenium基于自動測試的Python爬蟲程序,主要利用它的xpath語句,通過分析網頁DOM樹結構進行爬取內容,同時可以結合Phantomjs模擬瀏覽器進行鼠標或鍵盤操作。但是,更為廣泛使用的Python爬蟲框架是——Scrapy爬蟲。這是一篇在Windows系統下介紹 Scrapy爬蟲安裝及入門介紹的相關文章。
? ? ? ? 官方 Scrapy ?:http://scrapy.org/
? ? ? ? 官方英文文檔:http://doc.scrapy.org/en/latest/index.html
? ? ? ? 官方中文文檔:https://scrapy-chs.readthedocs.org/zh_CN/0.24/index.html
一. 安裝過程
? ? ? ? 本文主要講述Windows下的安裝過程,首先我的Python是2.7.8版本。
? ? ? ? 主要通過Python的PIP語句進行安裝:
? ? ? ? 通過 pip list outdated 命令查看軟件最新版本,表示PIP安裝成功。
? ? ? ? 然后,輸入 pip install scrapy?命令進行安裝。
? ? ? ? 安裝成功后,通過cmd調用 scrapy 指令查看,表示安裝成功。
?
? ? ? ? 如果過程中存在如下圖所示錯誤"no module named win32api",則需要下載安裝win32,選擇2.7.8版本。地址為:http://sourceforge.net/projects/pywin32/files/
? ? ? ? 此時,scrapy安裝成功,可以進行第二步"第一個scrapy爬蟲實現"了~
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爬蟲程序:
? ? ? ? 打開Python IDLE,創建myspider.py文件,代碼如下:
import scrapyclass BlogSpider(scrapy.Spider):name = 'blogspider'start_urls = ['http://blog.scrapinghub.com']def parse(self, response):for url in response.css('ul li a::attr("href")').re(r'.*/\d\d\d\d/\d\d/$'):yield scrapy.Request(response.urljoin(url), self.parse_titles)def parse_titles(self, response):for post_title in response.css('div.entries > ul > li a::text').extract():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項目的結果圖如下所示:參考原文作者博客
? ? ? ? 1.items.py:定義我們要抓取的數據
# Define here the models for your scraped items # # See documentation in: # http://doc.scrapy.org/en/latest/topics/items.htmlfrom scrapy.item import Item, Field class TencentItem(Item): name = Field() # 職位名稱 catalog = Field() # 職位類別 workLocation = Field() # 工作地點 recruitNumber = Field() # 招聘人數 detailLink = Field() # 職位詳情頁鏈接 publishTime = Field() # 發布時間 ? ? ? ? 2.spiders文件夾中tencent_spider.py文件:實現Spider
? ? ? ??Spider是一個繼承自scrapy.contrib.spiders.CrawlSpider的Python類,有三個必需的定義的成員
? ? ? ? name: 名字,這個spider的標識
? ? ? ? start_urls:一個url列表,spider從這些網頁開始抓取
? ? ? ? parse():一個方法,當start_urls里面的網頁抓取下來之后需要調用這個方法解析網頁內容,同時需要返回下一個需要抓取的網頁,或者返回items列表
import re import jsonfrom scrapy.selector import Selector try:from scrapy.spider import Spider except:from scrapy.spider import BaseSpider as Spider from scrapy.utils.response import get_base_url from scrapy.utils.url import urljoin_rfc from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor as slefrom itzhaopin.items import * from itzhaopin.misc.log import *class TencentSpider(CrawlSpider):name = "tencent"allowed_domains = ["tencent.com"]start_urls = ["http://hr.tencent.com/position.php"]rules = [Rule(sle(allow=("/position.php\?&start=\d{,4}#a")), follow=True, callback='parse_item')]def parse_item(self, response):items = []sel = Selector(response)base_url = get_base_url(response)sites_even = sel.css('table.tablelist tr.even')for site in sites_even:item = TencentItem()item['name'] = site.css('.l.square a').xpath('text()').extract()[0]relative_url = site.css('.l.square a').xpath('@href').extract()[0]item['detailLink'] = urljoin_rfc(base_url, relative_url)item['catalog'] = site.css('tr > td:nth-child(2)::text').extract()[0]item['workLocation'] = site.css('tr > td:nth-child(4)::text').extract()[0]item['recruitNumber'] = site.css('tr > td:nth-child(3)::text').extract()[0]item['publishTime'] = site.css('tr > td:nth-child(5)::text').extract()[0]items.append(item)#print repr(item).decode("unicode-escape") + '\n'sites_odd = sel.css('table.tablelist tr.odd')for site in sites_odd:item = TencentItem()item['name'] = site.css('.l.square a').xpath('text()').extract()[0]relative_url = site.css('.l.square a').xpath('@href').extract()[0]item['detailLink'] = urljoin_rfc(base_url, relative_url)item['catalog'] = site.css('tr > td:nth-child(2)::text').extract()[0]item['workLocation'] = site.css('tr > td:nth-child(4)::text').extract()[0]item['recruitNumber'] = site.css('tr > td:nth-child(3)::text').extract()[0]item['publishTime'] = site.css('tr > td:nth-child(5)::text').extract()[0]items.append(item)#print repr(item).decode("unicode-escape") + '\n'info('parsed ' + str(response))return itemsdef _process_request(self, request):info('process ' + str(request))return request ? ? ? ?3.pipelines.py:實現PipeLine
? ? ? ?? PipeLine用來對Spider返回的Item列表進行保存操作,可以寫入到文件、或者數據庫等。 PipeLine只有一個需要實現的方法:process_item,例如我們將Item保存到JSON格式文件中: # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.htmlfrom scrapy import signals import json import codecsclass JsonWithEncodingTencentPipeline(object):def __init__(self):self.file = codecs.open('tencent.json', 'w', encoding='utf-8')def process_item(self, item, spider):line = json.dumps(dict(item), ensure_ascii=False) + "\n"self.file.write(line)return itemdef spider_closed(self, spider):self.file.close( ) ? ? ? ? 4.settings.py:設置文件
# Scrapy settings for itzhaopin project # # For simplicity, this file contains only the most important settings by # default. All the other settings are documented here: # # http://doc.scrapy.org/en/latest/topics/settings.html #BOT_NAME = 'itzhaopin'SPIDER_MODULES = ['itzhaopin.spiders'] NEWSPIDER_MODULE = 'itzhaopin.spiders'# Crawl responsibly by identifying yourself (and your website) on the user-agent #USER_AGENT = 'itzhaopin (+http://www.yourdomain.com)'ITEM_PIPELINES = {'itzhaopin.pipelines.JsonWithEncodingTencentPipeline': 300, }LOG_LEVEL = 'INFO'
? ? ? ? 看了這個簡單的例子后,后面的文章就會根據原文進行一些自定義的爬蟲實驗了,希望對你有所幫助吧~同時還是感覺Linux下學習這些更適合些。最后推薦兩篇文章:
? ? ? ??Python爬蟲框架Scrapy實戰之定向批量獲取職位招聘信息
? ? ? ? Scrapy研究探索專欄 作者:young-hz
? ? ? ??[Python]網絡爬蟲(12):爬蟲框架Scrapy的第一個爬蟲示例入門教程
? ? ? ??(By:Eastmount 2015-11-08 深夜4點???http://blog.csdn.net/eastmount/)
總結
以上是生活随笔為你收集整理的[Python爬虫] scrapy爬虫系列 一.安装及入门介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [笔试题目] 美团2015年9月后端开发
- 下一篇: 程序人生:无他,唯心向尔