亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

實踐Python的爬蟲框架Scrapy來抓取豆瓣電影TOP250

2020-01-04 17:49:37
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了實踐Python的爬蟲框架Scrapy來抓取豆瓣電影TOP250的過程,文中的環境基于Windows操作系統,需要的朋友可以參考下
 

安裝部署Scrapy

在安裝Scrapy前首先需要確定的是已經安裝好了Python(目前Scrapy支持Python2.5,Python2.6和Python2.7)。官方文檔中介紹了三種方法進行安裝,我采用的是使用 easy_install 進行安裝,首先是下載Windows版本的setuptools(下載地址:http://pypi.python.org/pypi/setuptools),下載完后一路NEXT就可以了。
安裝完setuptool以后。執行CMD,然后運行一下命令:

easy_install -U Scrapy

同樣的你可以選擇使用pip安裝,pip的地址:http://pypi.python.org/pypi/pip
使用pip安裝Scrapy的命令為

pip install Scrapy

如果你的電腦先前裝過visual studio 2008 或 visual studio 2010那么一起順利,Scrapy已經安裝完成。如果出現下列報錯:Unable to find vcvarsall.bat 那么你需要折騰下。你可以安裝visual studio 后進行安裝或采用下面的方式進行解決:
首先安裝MinGW(MinGW下載地址:http://sourceforge.net/projects/mingw/files/),在MinGW的安裝目錄下找到bin的文件夾,找到mingw32-make.exe,復制一份更名為make.exe;
把MinGW的路徑添加到環境變量path中,比如我把MinGW安裝到D:/MinGW/中,就把D:/MinGW/bin添加到path中;
打開命令行窗口,在命令行窗口中進入到要安裝代碼的目錄下;
輸入如下命令 setup.py install build –compiler=mingw32 就可以安裝了。

如果出現“xslt-config' 不是內部或外部命令,也不是可運行的程序或批處理文件。”錯誤,原因主要是lxml安裝不成功,只要上http://pypi.python.org/simple/lxml/下載個exe文件進行安裝就可以了。
下面就可以進入正題了。

新建工程
讓我們來用爬蟲獲取豆瓣電影Top 250的電影信息吧。開始之前,我們新建一個Scrapy工程。因為我用的Win7,所以在CMD中進入一個我希望保存代碼的目錄,然后執行:

D:/WEB/Python>scrapy startproject doubanmoive

這個命令會在當前目錄下創建一個新的目錄doubanmoive,目錄結構如下:

D:/WEB/Python/doubanmoive>tree /fFolder PATH listing for volume DataVolume serial number is 00000200 34EC:9CB9D:.│ scrapy.cfg│└─doubanmoive │ items.py │ pipelines.py │ settings.py │ __init__.py │ └─spiders   __init__.py

這些文件主要為:

  • doubanmoive/items.py: 定義需要獲取的內容字段,類似于實體類。
  • doubanmoive/pipelines.py: 項目管道文件,用來處理Spider抓取的數據。
  • doubanmoive/settings.py: 項目配置文件
  • doubanmoive/spiders: 放置spider的目錄

定義項目(Item)

Item是用來裝載抓取數據的容器,和Java里的實體類(Entity)比較像,打開doubanmoive/items.py可以看到默認創建了以下代碼。

from scrapy.item import Item, Fieldclass DoubanmoiveItem(Item):  pass

我們只需要在 Doubanmoive 類中增加需要抓取的字段即可,如 name=Field() ,最后根據我們的需求完成代碼如下。

from scrapy.item import Item, Fieldclass DoubanmoiveItem(Item): name=Field()#電影名 year=Field()#上映年份 score=Field()#豆瓣分數 director=Field()#導演 classification=Field()#分類 actor=Field()#演員

編寫爬蟲(Spider)

Spider是整個項目中最核心的類,在這個類里我們會定義抓取對象(域名、URL)以及抓取規則。Scrapy官方文檔中的教程是基于 BaseSpider 的,但 BaseSpider 只能爬取給定的URL列表,無法根據一個初始的URL向外拓展。不過除了 BaseSpider ,還有很多可以直接繼承 Spider 的類,比如 scrapy.contrib.spiders.CrawlSpider 。

在 doubanmoive/spiders 目錄下新建moive_spider.py文件,并填寫代碼。

# -*- coding: utf-8 -*-from scrapy.selector import Selectorfrom scrapy.contrib.spiders import CrawlSpider,Rulefrom scrapy.contrib.linkextractors.sgml import SgmlLinkExtractorfrom doubanmoive.items import DoubanmoiveItemclass MoiveSpider(CrawlSpider): name="doubanmoive" allowed_domains=["movie.douban.com"] start_urls=["http://movie.douban.com/top250"] rules=[  Rule(SgmlLinkExtractor(allow=(r'http://movie.douban.com/top250/?start=/d+.*'))),  Rule(SgmlLinkExtractor(allow=(r'http://movie.douban.com/subject//d+')),callback="parse_item"),   ] def parse_item(self,response):  sel=Selector(response)  item=DoubanmoiveItem()  item['name']=sel.xpath('//*[@id="content"]/h1/span[1]/text()').extract()  item['year']=sel.xpath('//*[@id="content"]/h1/span[2]/text()').re(r'/((/d+)/)')  item['score']=sel.xpath('//*[@id="interest_sectl"]/div/p[1]/strong/text()').extract()  item['director']=sel.xpath('//*[@id="info"]/span[1]/a/text()').extract()  item['classification']= sel.xpath('//span[@property="v:genre"]/text()').extract()  item['actor']= sel.xpath('//*[@id="info"]/span[3]/a[1]/text()').extract()  return item

代碼說明: MoiveSpider 繼承Scrapy中的 CrawlSpider , name , allow_domains , start_url 看名字就知道什么含義,其中rules稍微復雜一些,定義了URL的抓取規則,符合 allow 正則表達式的鏈接都會加入到Scheduler(調度程序)。通過分析豆瓣電影Top250的分頁URL http://movie.douban.com/top250?start=25&filter=&type= 可以得到以下規則

Rule(SgmlLinkExtractor(allow=(r'http://movie.douban.com/top250/?start=/d+.*'))),
而我們真正要抓取的頁面是每一個電影的詳細介紹,如肖申克的救贖的鏈接為 http://movie.douban.com/subject/1292052/ ,那只有 subject 后面的數字是變化的,根據正則表達式得到如下代碼。我們需要抓取這種類型鏈接中的內容,于是加入callback屬性,將Response交給parse_item函數來處理。

Rule(SgmlLinkExtractor(allow=(r'http://movie.douban.com/subject//d+')),callback="parse_item"),      
在 parse_item 函數中的處理邏輯非常簡單,獲取符合條件鏈接的代碼,然后根據一定的規則抓取內容賦給item并返回 Item Pipeline 。獲取大部分標簽的內容不需要編寫復雜的正則表達式,我們可以使用 XPath 。 XPath 是一門在 XML 文檔中查找信息的語言,但它也可以用在HTML中。下表列出了常用表達式。

 

表達式 描述
nodename 選取此節點的所有子節點。
/ 從根節點選取。
// 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。
. 選取當前節點。
.. 選取當前節點的父節點。
@ 選取屬性。

如 //*[@id="content"]/h1/span[1]/text() 獲取的結果是在id為content的任意元素下h1元素下的span列表中第一個元素的文本內容。我們可以通過Chrome開發者工具(F12)來獲取某內容的XPath表達式,具體操作為在需要抓取的內容上點擊審查元素,下方就會出現開發者工具,并定位到該元素,在內容上點擊右鍵,選擇復制XPath。

 

實踐Python的爬蟲框架Scrapy來抓取豆瓣電影TOP250

存儲數據

爬蟲獲取到數據以后我們需要將其存儲到數據庫中,之前我們提到該操作需要靠項目管道(pipeline)來處理,其通常執行的操作為:

  • 清洗HTML數據
  • 驗證解析到的數據(檢查項目是否包含必要的字段)
  • 檢查是否是重復數據(如果重復就刪除)
  • 將解析到的數據存儲到數據庫中

由于我們獲取的數據格式多種多樣,有一些存儲在關系型數據庫中并不方便,所以我在寫完MySQL版本的Pipeline之后又寫了一個MongoDB的。

MySQL版本: 

# -*- coding: utf-8 -*-from scrapy import logfrom twisted.enterprise import adbapifrom scrapy.http import Requestimport MySQLdbimport MySQLdb.cursorsclass DoubanmoivePipeline(object): def __init__(self):  self.dbpool = adbapi.ConnectionPool('MySQLdb',    db = 'python',    user = 'root',    passwd = 'root',    cursorclass = MySQLdb.cursors.DictCursor,    charset = 'utf8',    use_unicode = False  ) def process_item(self, item, spider):  query = self.dbpool.runInteraction(self._conditional_insert, item)  query.addErrback(self.handle_error)  return item def _conditional_insert(self,tx,item):  tx.execute("select * from doubanmoive where m_name= %s",(item['name'][0],))  result=tx.fetchone()  log.msg(result,level=log.DEBUG)  print result  if result:   log.msg("Item already stored in db:%s" % item,level=log.DEBUG)  else:   classification=actor=''   lenClassification=len(item['classification'])   lenActor=len(item['actor'])   for n in xrange(lenClassification):    classification+=item['classification'][n]    if n<lenClassification-1:     classification+='/'   for n in xrange(lenActor):    actor+=item['actor'][n]    if n<lenActor-1:     actor+='/'   tx.execute(/    "insert into doubanmoive (m_name,m_year,m_score,m_director,m_classification,m_actor) values (%s,%s,%s,%s,%s,%s)",/    (item['name'][0],item['year'][0],item['score'][0],item['director'][0],classification,actor))   log.msg("Item stored in db: %s" % item, level=log.DEBUG) def handle_error(self, e):  log.err(e)

MongoDB版本:

# -*- coding: utf-8 -*-import pymongofrom scrapy.exceptions import DropItemfrom scrapy.conf import settingsfrom scrapy import logclass MongoDBPipeline(object): #Connect to the MongoDB database def __init__(self):  connection = pymongo.Connection(settings['MONGODB_SERVER'], settings['MONGODB_PORT'])  db = connection[settings['MONGODB_DB']]  self.collection = db[settings['MONGODB_COLLECTION']] def process_item(self, item, spider):  #Remove invalid data  valid = True  for data in item:   if not data:   valid = False   raise DropItem("Missing %s of blogpost from %s" %(data, item['url']))  if valid:  #Insert data into database   new_moive=[{    "name":item['name'][0],    "year":item['year'][0],    "score":item['score'][0],    "director":item['director'],    "classification":item['classification'],    "actor":item['actor']   }]   self.collection.insert(new_moive)   log.msg("Item wrote to MongoDB database %s/%s" %   (settings['MONGODB_DB'], settings['MONGODB_COLLECTION']),   level=log.DEBUG, spider=spider)   return item

可以看到其基本的處理流程是一樣,但是MySQL不太方便的一點就是需要將數組類型的數據通過分隔符轉換。而MongoDB支持存入List、Dict等多種類型的數據。

配置文件

在運行爬蟲之前還需要將在 settings.py 中增加一些配置信息。

BOT_NAME = 'doubanmoive'SPIDER_MODULES = ['doubanmoive.spiders']NEWSPIDER_MODULE = 'doubanmoive.spiders'ITEM_PIPELINES={ 'doubanmoive.mongo_pipelines.MongoDBPipeline':300, 'doubanmoive.pipelines.DoubanmoivePipeline':400,}LOG_LEVEL='DEBUG'DOWNLOAD_DELAY = 2RANDOMIZE_DOWNLOAD_DELAY = TrueUSER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5'COOKIES_ENABLED = TrueMONGODB_SERVER = 'localhost'MONGODB_PORT = 27017MONGODB_DB = 'python'MONGODB_COLLECTION = 'test'

ITEM_PIPELINES 中定義了MySQL和MongoDB兩個Pipeline文件,后面的數字代表執行的優先級順序,范圍為0~1000。 而中間的 DOWNLOAD_DELAY 等信息是為了防止爬蟲被豆瓣Ban掉,增加了一些隨機延遲,瀏覽器代理等。最后的就是MongoDB的配置信息,MySQL也可以參考這種方式來寫。

至此為止,抓取豆瓣電影的爬蟲就已經完成了。在命令行中執行 Scrapy crawl doubanmoive 讓蜘蛛開始爬行吧!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中国china体内裑精亚洲片| 日本不卡视频在线播放| 中文字幕不卡av| 欧美限制级电影在线观看| 永久免费看mv网站入口亚洲| 国产精品精品一区二区三区午夜版| 欧美一级大胆视频| 深夜福利91大全| 亚洲v日韩v综合v精品v| 国产在线观看一区二区三区| 欧美一级高清免费播放| 色阁综合伊人av| 欧美亚洲视频在线看网址| 国产精品亚洲视频在线观看| 国产在线视频一区| 亚洲国产日韩欧美在线动漫| 国产精品96久久久久久| 国产精品美乳一区二区免费| 欧美午夜无遮挡| 日韩成人高清在线| 欧美性xxxxxxxxx| 亚洲天堂第一页| 欧美日韩在线影院| 色偷偷av亚洲男人的天堂| 精品夜色国产国偷在线| 亚洲免费av片| 在线看片第一页欧美| 国产美女精品视频免费观看| 91视频免费网站| 中文字幕av一区中文字幕天堂| 秋霞av国产精品一区| 伊人成人开心激情综合网| 欧美大秀在线观看| 51久久精品夜色国产麻豆| 中国日韩欧美久久久久久久久| 久久综合网hezyo| www.美女亚洲精品| 精品亚洲精品福利线在观看| 欧美激情一区二区三区久久久| 在线视频一区二区| 亚洲少妇中文在线| 久久久久久久一区二区| 久久av在线播放| 国产欧美日韩精品丝袜高跟鞋| 精品亚洲一区二区三区在线播放| 欧美极品欧美精品欧美视频| 97精品伊人久久久大香线蕉| 欧美国产第二页| 国产精品久久久久久久久久ktv| 亚洲毛片在线看| 欧美三级欧美成人高清www| 久久久久久一区二区三区| 综合久久五月天| 91成品人片a无限观看| 亚洲国产高清高潮精品美女| 日本久久亚洲电影| 九九精品在线视频| 久久久精品视频在线观看| 亚洲欧洲美洲在线综合| 欧美日韩免费在线| 欧美视频在线看| 日韩av在线网站| 国内精品久久久久伊人av| 原创国产精品91| 久久夜精品va视频免费观看| 91亚洲精华国产精华| 国产成人一区二区三区电影| 国产成+人+综合+亚洲欧美丁香花| 日本伊人精品一区二区三区介绍| 国产99久久精品一区二区永久免费| 国产精品视频久久久| 91夜夜未满十八勿入爽爽影院| 91视频免费在线| 久久夜色精品国产| 久久影院免费观看| 岛国视频午夜一区免费在线观看| 国产精品久久久久91| 91精品国产91久久久久久最新| 国产精品主播视频| 久久久久久久久久久国产| 免费99精品国产自在在线| 久久久成人av| 国产99久久精品一区二区 夜夜躁日日躁| 欧美日韩午夜激情| 深夜福利国产精品| 久久香蕉精品香蕉| 欧美日韩在线观看视频| 日韩电影免费观看在线观看| 亚洲视频电影图片偷拍一区| 欧美电影《睫毛膏》| 91精品国产高清久久久久久久久| 91视频国产一区| 91超碰中文字幕久久精品| 久久91亚洲精品中文字幕奶水| 久久人人爽人人爽人人片av高清| 国产97在线观看| 亚洲精品福利资源站| 国产精品美女午夜av| 色av吧综合网| 欧美中文字幕视频在线观看| 国产精品99久久久久久人| 色综合五月天导航| 97超视频免费观看| 亚洲女人天堂网| 国产精品久久久久aaaa九色| 欧美日产国产成人免费图片| 久久久国产91| 久久久久日韩精品久久久男男| 日韩视频中文字幕| 欧美午夜片欧美片在线观看| 久久精品国产96久久久香蕉| 热久久这里只有| 欧美中文在线观看国产| 日韩精品免费在线播放| 国产成人涩涩涩视频在线观看| 成人黄色生活片| 欧美激情a在线| 中文字幕欧美日韩精品| 成人欧美一区二区三区黑人孕妇| 日韩成人免费视频| 亚洲女人被黑人巨大进入| 亚洲人成欧美中文字幕| 国产69精品久久久| 中文字幕精品av| 26uuu另类亚洲欧美日本一| 精品视频在线观看日韩| 日韩av网址在线| 97超碰蝌蚪网人人做人人爽| 欧美性色xo影院| 这里只有精品久久| 欧美日韩国产在线看| 国产精品久久久久久亚洲影视| 欧美日韩国产中文精品字幕自在自线| 久久久最新网址| 日韩精品欧美激情| 91精品视频播放| 亚洲最大福利网站| 国产精品女人久久久久久| 日本欧美一二三区| 日韩电影大全免费观看2023年上| 久久精品99久久久香蕉| 另类视频在线观看| 欧洲s码亚洲m码精品一区| 日韩av免费看网站| 欧美大胆a视频| 这里只有视频精品| 欧美人与性动交| 欧美男插女视频| 精品久久久久久久久国产字幕| 自拍偷拍免费精品| 亚洲欧美中文日韩在线| 久久综合伊人77777| 日韩精品视频在线观看免费| 精品国产31久久久久久| 亚洲人成网站色ww在线| 欧美午夜无遮挡| 日韩电影中文 亚洲精品乱码| 久久影院模特热| 欧洲日韩成人av| 国产成人亚洲综合91| 亚洲毛片在线看| 欧美精品情趣视频| 2019国产精品自在线拍国产不卡| 日本三级久久久|