用Scrapy寫爬蟲
阿新 • • 發佈:2018-12-22
一、scrapy專案的目錄結構
包括了一個spiders資料夾,以及__init__.py、items.py、pipelines.py、settings.py等python檔案。
- items.py是爬蟲專案的資料容器檔案,用來定義我們要獲取的資料。
- pipelines.py 是爬蟲專案的管道檔案,用來對items裡面定義的資料進行進一步的加工與處理。
- settinng.py是專案的設定檔案。
- spiders資料夾下面放置的是爬蟲部分相關的檔案。
二、spider的編寫
1.建立專案
在命令列中輸入scrapy startproject 專案名,如下我建立了一個名為mypjt1的scrapy爬蟲專案
PS D:\學習資料及空間> scrapy startproject mypjt1
New Scrapy project 'mypjt1', using template directory 'd:\\users\\administrator\\anaconda3\\lib\\site-packages\\scrapy\\templates\\project', created in:
D:\學習資料及空間\mypjt1
2.items的編寫
import scrapy class Mypjt1Item(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field()
3.spider的編寫
在爬蟲專案中通過genspider命令建立一個爬蟲檔案,然後我們在對該爬蟲檔案進行相應的修改與編寫。
在命令列中切換到相應的專案目錄下,然後輸入scrapy genspider -t 模板 新爬蟲名 爬取的域名
PS D:\學習資料及空間> cd mypjt1 PS D:\學習資料及空間\mypjt1> scrapy genspider -t basic myspd sina.com.cn Created spider 'myspd' using template 'basic' in module: mypjt1.spiders.myspd
開啟後,該檔案的預設程式碼為
# -*- coding: utf-8 -*-
import scrapy
class MyspdSpider(scrapy.Spider):
name = 'myspd'
allowed_domains = ['sina.com.cn']
start_urls = ['http://sina.com.cn/']
def parse(self, response):
pass
name 是爬蟲的名稱,此時我的爬蟲名稱為myspd,allowed_domains代表的是允許爬行的域名, start_urls代表的是爬行的起始網址, parse方法是處理Scrapy爬蟲爬行到的網頁響應預設方法,該方法可以對響應進行處理和返回處理後的資料,在該屬性中,我們可以定義多個起始網址,中間用逗號隔開。
進行簡單的修改後:
# -*- coding: utf-8 -*-
import scrapy
from mypjt1.items import Mypjt1Item
class MyspdSpider(scrapy.Spider):
name = 'myspd'
allowed_domains = ['sina.com.cn']
start_urls = (
'http://sina.com.cn/',
'https://mil.news.sina.com.cn/'
)
def parse(self, response):
item = Mypjt1Item()
item['title'] = response.xpath("/html/head/title").extract()
print(item['title'])
我們的提取方式是Xpath,Xpath學習網址:http://www.w3school.com.cn/xpath/index.asp
4.執行
輸入及相應的輸出結果
PS D:\學習資料及空間\mypjt1> scrapy crawl myspd --nolog
['<title>軍事頻道_最多軍迷首選的軍事門戶_新浪網</title>']
['<title>新聞中心首頁_新浪網</title>']
5.對爬取的資料進行進一步的加工
這時候我們用到了pipelines.py檔案,但在這之前我們應該對settings.py檔案配置。
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
#ITEM_PIPELINES = {
# 'mypjt1.pipelines.Mypjt1Pipeline': 300,
#}
將預設配置修改如下:
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'mypjt1.pipelines.Mypjt1Pipeline': 300,
}
編寫pipelines.py檔案將爬取的資料儲存到mydata.txt檔案中
# -*- coding: utf-8 -*-
import codecs
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
class Mypjt1Pipeline(object):
def __init__(self):
#初始化,開始時呼叫,開啟一個檔案用於儲存爬取到的資料
self.file = codecs.open('D:\\python35\\crawler\\mydata.txt',"wb",encoding="utf-8")
#是pipeline的主要處理方法,預設會自動呼叫
def process_item(self, item, spider):
l = str(item) + '\n'
#寫入到相應的檔案中
self.file.write(l)
return item
#close_spider()方法一般在關閉蜘蛛時呼叫
def close_spider(self):
#關閉檔案
self.file.close()
之後在myspd,py的parse方法加上yield item如下
def parse(self, response):
item = Mypjt1Item()
item['title'] = response.xpath("/html/head/title").extract()
print(item['title'])
yield item
執行之後結果