環(huán)境:
Ubuntu 18.04
Python 3.6.9
scrapy的安裝
準(zhǔn)備工作,需要pip呼巷、python-dev
sudo apt-get install python3-pip //指定安裝python3的pip
sudo apt-get install python3-dev //指定安裝python3最新的
因?yàn)楸救颂摂M機(jī)上同時(shí)擁有python2和python3的版本囱修,這里在安裝時(shí)需要指定是python3的版本,如果不指定朵逝,默認(rèn)安裝python2的版本蔚袍。
安裝scrapy
sudo pip3 install Scrapy
網(wǎng)上的教程中說(shuō)需要安裝一些依賴(lài),這里提供下命令配名,如果環(huán)境依賴(lài)缺少啤咽,自行安裝下
sudo apt-get install build-essential
sudo apt-get install libxml2-dev
sudo apt-get install libxslt1-dev
sudo apt-get install python-setuptools
最后使用命令 scrapy --version
,若顯示scrapy版本渠脉,則安裝成功
創(chuàng)建項(xiàng)目
在你需要?jiǎng)?chuàng)建項(xiàng)目的目錄執(zhí)行
scrapy startproject xiaomiapp
scrapy startproject 項(xiàng)目名
這里演示的爬蟲(chóng)網(wǎng)站為小米應(yīng)用商城宇整,項(xiàng)目名設(shè)為xiaomiapp
新建的項(xiàng)目目錄為:
xiaomiapp/
├── scrapy.cfg
└── xiaomiapp
├── __init__.py
├── items.py
├── middlewares.py
├── pipelines.py
├── __pycache__
├── settings.py
└── spiders
├── __init__.py
└── __pycache__
scrapy.cfg
:項(xiàng)目配置文件
items.py
:項(xiàng)目的數(shù)據(jù)容器文件,用來(lái)定義獲取的數(shù)據(jù)
middlewares.py
:項(xiàng)目的中間件文件
pipelines.py
:項(xiàng)目管道文件芋膘,用于對(duì)items中的數(shù)據(jù)進(jìn)行進(jìn)一步的處理
settings.py
:設(shè)置文件鳞青,包含了爬蟲(chóng)項(xiàng)目的設(shè)置信息
spiders
:存放自定義爬蟲(chóng)文件的目錄
進(jìn)入spiders
目錄,執(zhí)行
scrapy genspider xiaomiapp app.mi.com/hotCatApp/10
scrapy genspider 文件名 爬取網(wǎng)站域名
为朋,創(chuàng)建自定義爬蟲(chóng)文件臂拓,修改其內(nèi)容:
# -*- coding: utf-8 -*-
import scrapy
from xiaomiapp.items import XiaomiappItem
class XiaomiappPySpider(scrapy.Spider):
name = 'xiaomiapp.py'
allowed_domains = ['app.mi.com/hotCatApp/10']
start_urls = ['http://app.mi.com/hotCatApp/10/']
def parse(self, response):
lies = response.css('.applist li')
for li in lies:
item = XiaomiappItem()
item['appname'] = li.css('h5 a::text').extract()
item['appdesc'] = li.css('.app-desc a::text').extract()
yield item
pass
說(shuō)明:
name
:文件名
allowed_domains
:允許的域名
start_urls
:請(qǐng)求的地址
結(jié)合網(wǎng)站的實(shí)際內(nèi)容,使用response.css()
來(lái)獲取網(wǎng)站內(nèi)容习寸,除了CSS選擇器之外胶惰,Scrapy還支持使用re方法以正則表達(dá)式提取內(nèi)容,以及xpath方法以XPATH語(yǔ)法提取內(nèi)容霞溪。.extract()
可直接獲取包含在標(biāo)簽內(nèi)的文本
修改items.py
內(nèi)容:
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class XiaomiappItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
appname = scrapy.Field()
appdesc = scrapy.Field()
pass
item是保存爬取數(shù)據(jù)的容器孵滞,將可將獲取的數(shù)據(jù)放到item中中捆,類(lèi)似于字典。
運(yùn)行
在項(xiàng)目目錄執(zhí)行
scrapy crawl xiaomiapp
結(jié)果如下:
數(shù)據(jù)保存
將數(shù)據(jù)保存為csv坊饶、xml泄伪、json格式,可以直接使用命令:
scrapy crawl xiaomiapp -o xiaomiapp.csv
scrapy crawl xiaomiapp -o xiaomiapp.xml
scrapy crawl xiaomiapp -o xiaomiapp.json
運(yùn)行后目錄中會(huì)出現(xiàn)csv匿级、xml蟋滴、json格式文件,如果中文輸出亂碼痘绎,在settings.py
中配置
FEED_EXPORT_ENCODING = 'utf-8'
再次運(yùn)行脓杉,結(jié)果: