scrapy爬蟲架構入門執行個體(爬取貓眼電影top100)
- 安裝scrapy
- scrapy元件和流程
- 一個簡單的項目執行個體(爬貓眼電影排行)
-
- 項目結構
- 分析要爬取的網頁和内容
- 建立一個spider
- 定義需要的item
- 然後修改spider的方法來擷取資訊
- 運作并儲存
安裝scrapy
因為用的是anaconda,是以直接pip install scrapy就成功了。如果不成功可以pip install lxml先,可以檢視下版本
scrapy --version
Scrapy 1.7.1 - project: tutorial
scrapy元件和流程
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csITSU90d3dFZoJ0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0QTNzATOykDMzIzNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
一個簡單的項目執行個體(爬貓眼電影排行)
用終端建立,cd到你放scrapy項目的檔案夾,然後開始項目maoyan是你的項目名,自己取名
scrapy startproject maoyan
項目結構
檔案 | 功能 |
---|---|
scrapy.cfg | 配置檔案 |
spiders | 存放你Spider檔案,也就是你爬取的py檔案 |
items.py檔案 | 相當于一個容器,和字典較像 |
middlewares.py檔案 | 定義Downloader Middlewares(下載下傳器中間件)和Spider Middlewares(蜘蛛中間件)的實作 |
pipelines.py檔案 | 定義Item Pipeline的實作,實作資料的清洗,儲存,驗證。 |
settings.py檔案 | 全局配置 |
分析要爬取的網頁和内容
- 要爬取的網址是’https://maoyan.com/board/4?offset=0’ 然後往後的十個網頁,寫成清單
- 然後是要爬取的内容:電影名、評分、主演等
建立一個spider
屬性或方法 | 作用 |
---|---|
name | 是項目的名字 |
allowed_domains | 是允許爬取的域名,比如一些網站有相關連結,域名就和本網站不同,這些就會忽略。 |
start_urls | 要通路的位址清單,和start_requests方法隻需要定義一個,都是調用parse方法解析 |
start_requests方法 | 由此方法通過下面連結爬取頁面 |
parse方法 | 是Spider的一個方法,在請求start_url後,之後的方法,這個方法是對網頁的解析,與提取自己想要的東西。 |
response參數 | 是請求網頁後傳回的内容,也就是你需要解析的網頁。 |
import scrapy
class MySpider(scrapy.Spider):
name = 'maoyan' # 項目名
allowed_domains = ['maoyan.com'] # 允許通路的域名
def start_requests(self):
url_list = []
for i in range(0,10):
url_list.append('https://maoyan.com/board/4?offset='+str(i))
# 定義爬取的連結
urls = url_list
for url in urls:
# 爬取到的頁面如何處理?送出給parse方法處理
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
pass
定義需要的item
- item是儲存爬取資料的容器,使用的方法和字典差不多。
-
我們打開items.py檔案,之後我們想要提取的資訊有:
index(排名)、title(電影名)、star(主演)、releasetime(上映時間)、score(評分)
class MaoyanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
index = scrapy.Field()
title = scrapy.Field()
star = scrapy.Field()
releasetime = scrapy.Field()
score = scrapy.Field()
然後修改spider的方法來擷取資訊
from maoyan.items import MaoyanItem
...
def parse(self, response):
'''
start_requests已經爬取到頁面,那如何提取我們想要的内容呢?那就可以在這個方法裡面定義。
1、定義連結;
2、通過連結爬取(下載下傳)頁面;
3、定義規則,然後提取資料;
'''
# 這裡用的css選擇查找資訊,也可以用xpath
dl = response.css('.board-wrapper dd')
for dd in dl:
item = MaoyanItem()
# extract()[0]等同于extract_first()
item['index'] = dd.css('.board-index::text').extract_first()
item['title'] = dd.css('.name a::text').extract_first()
# strip方法是去除空格和換行符
item['star'] = dd.css('.star::text').extract_first().strip()
item['releasetime'] = dd.css('.releasetime::text').extract_first()
item['score'] = dd.css('.integer::text').extract_first()+dd.css('.fraction::text').extract_first()
yield item
...
運作并儲存
這樣就寫完了一個簡單的項目,運作即可:
- 在終端的目前檔案夾下輸入:scrapy crawl maoyan(項目的名字)
- 這樣隻運作了代碼,并沒有儲存,儲存有多種方式
- -o maoyan.csv或者-o maoyan.xml或者-o maoyan.json
- 設定編碼格式 -s FEED_EXPORT_ENCODING=UTF8
- 選擇csv(表格)格式儲存看看:scrapy crawl maoyan -o maoyan.csv -s FEED_EXPORT_ENCODING=UTF8
找到檔案并打開: