上一篇文章已經(jīng)說了怎么安裝sarapy,這次就直接拿新浪試試??!
安裝sprapy:↓
http://www.itdecent.cn/p/ddf57836d625
CrwlSpider允許用戶根據(jù)一定的URl規(guī)則提取跟進(jìn)的鏈接,因?yàn)橐话愕木W(wǎng)站設(shè)計(jì)URL都符合一定的規(guī)則,CrwlSpider正式利用這種URl構(gòu)造跟進(jìn)鏈接。
1、rules:
rules是規(guī)則對(duì)象的集合,也就是說爬取規(guī)則是在rules中定義,可定義多條規(guī)則,如果多個(gè)Rule匹配了相同的鏈接,則根據(jù)定義順序,使用第一個(gè)。
2、爬取規(guī)則:
link_extractor被稱為鏈接提取器,用它來定義具體的爬取規(guī)則,也就是說如何從爬取的頁面提取鏈接并且可方便的過濾選項(xiàng):
①. allow:值為正則表達(dá)式或正則表達(dá)式列表,當(dāng)URL匹配時(shí)提取這個(gè)規(guī)則,它為空或者沒有指定,將匹配所有連接。
②. deny值為正則表達(dá)式或正則表達(dá)式列表,URL匹配時(shí)不提取,優(yōu)先于allow,它為空或者沒有指定,將匹配所有連接。
廢話不多說,“翠花,上代碼。。?!?br>
開始spider:
1、首先建立項(xiàng)目,使用crawl模板生成spider文件
scrapy startproject pachong6 #建立項(xiàng)目

cd pachong6 #進(jìn)入項(xiàng)目
scrapy genspider -t crawl sina sina.com #使用crawl 生成spider文件

查看項(xiàng)目內(nèi)文件,已經(jīng)全部生成

2、定義爬取數(shù)據(jù),打開項(xiàng)目內(nèi)items文件,定義爬取項(xiàng)
(為定義演示用,只爬取三項(xiàng):新聞標(biāo)題,發(fā)布時(shí)間和新聞url)

注意:使用文本編輯器編輯完內(nèi)容時(shí),記得TAB轉(zhuǎn)為空格

3、分析新浪新聞
https://www.sina.com.cn/

發(fā)現(xiàn)每條新聞的鏈接都是
開頭:news.sina.com.cn****
結(jié)尾:(7位數(shù)字).shtml

知道了新浪新聞的URl規(guī)則,就好爬了
4、編寫spider文件
生成的項(xiàng)目中spiders文件夾下sina.py
比如我的:
pachong6/spiders/sina.py
打開這個(gè)文件會(huì)發(fā)現(xiàn),scrapy已經(jīng)幫我們把大部分都生成好了,只要自己再稍微改動(dòng)下就好了!

其中:
name=定義的爬蟲的名字
allowed_domains=定義爬取的域名,不在此域名中會(huì)被過濾
start_urls=默認(rèn)爬取的地址,爬蟲默認(rèn)從start_urls爬取
5、開始編寫爬蟲:
①. 在生成的文件中改動(dòng)相關(guān)內(nèi)容

②. 最核心的一步,定義鏈接提取規(guī)則

follow默認(rèn)為True,
follow是一個(gè)布爾值,指定這個(gè)規(guī)則從response提取的鏈接是否跟進(jìn),
也就是說在你打開的這個(gè)新聞頁面下還有別的新聞鏈接并且url和規(guī)則定義的匹配,那么爬蟲會(huì)繼續(xù)跟進(jìn)這個(gè)url,爬取你想要的內(nèi)容,知道爬取完整個(gè)網(wǎng)站。
至此,短短幾行就完成了整個(gè)新浪新聞的爬取
人生苦短,我用py
6、運(yùn)行爬蟲文件
在含有‘scrapy.cfg’文件路徑下,也就是項(xiàng)目的根目錄,打開cmd
輸入命令
scrapy list #檢查是否有格式錯(cuò)誤
繼續(xù)執(zhí)行命令
scrapy crawl sina -o sina.csv #運(yùn)行爬蟲并保存到csv文件或者json文件(sina.json)
爬蟲正常運(yùn)行,爬取到數(shù)據(jù)已經(jīng)在下方輸出了

查看生成的csv文件,保存正確。

注:如果保存csv文件未亂碼,打開爬蟲項(xiàng)目中settings.py
在其中添加
FEED_EXPORT_ENCODING = "gb18030" #防止寫入csv亂碼
保存文件,再次運(yùn)行爬蟲就不會(huì)亂碼了。
settings.py是爬蟲框架的設(shè)置文件,請(qǐng)求頭和間隔時(shí)間都在這里設(shè)置。
如果爬取到的內(nèi)容為空,查看是否Xpath是否正確
項(xiàng)目根目錄中,打開cmd,輸入
scrapy shell (url地址)

最后,附完整代碼
items文件
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class Pachong4Item(scrapy.Item):
title = scrapy.Field()
data = scrapy.Field()
content_url = scrapy.Field()
sina文件
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from pachong4.items import Pachong4Item
class SinaSpider(CrawlSpider):
name = 'sina'
allowed_domains = ['sina.com.cn']
start_urls = ['https://www.sina.com.cn/']
rules = (
Rule(LinkExtractor(allow=r'https://news.sina.com.cn/.*.shtml?'), callback='parse_item',
follow=True),
)
def parse_item(self, response):
item = Pachong4Item()
item['title'] = response.xpath('/html/body/div[2]/h1/text()').extract_first()
item['data'] = response.xpath('//*[@id="top_bar"]/div/div[2]/span/text()').extract_first()
item['content_url'] = response.xpath('/html/head/meta[10]/@content').extract_first()
return item
只需要幾條規(guī)則,就可以爬取整個(gè)網(wǎng)站,是不是特別簡單?
已經(jīng)非常接近通用爬蟲了?。。?/p>