如何利用scrapy新建爬蟲項目


抓取豆瓣top250電影數據,並將數據保存為csv、json和存儲到monogo數據庫中,目標站點:https://movie.douban.com/top250

一、新建項目

       打開cmd命令窗口,輸入:scrapy startproject douban【新建一個爬蟲項目】

       在命令行輸入:cd douban/spiders【進入spiders目錄】

       在命令行輸入:scrapy genspider douban_spider movie.douban.com【douban_spider為爬蟲文件,編寫xpath和正則表達式的地方,movie.douban.com為允許的域名】

       在pycharm打開創建的douban項目,目錄結構如下:

二、明確目標

       分析網站,確定要抓取的內容,編寫items文件;

import scrapy

class DoubanItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    #序號
    serial_number = scrapy.Field()
    #電影名稱
    movie_name = scrapy.Field()
    #電影簡介
    introduce = scrapy.Field()
    #星級
    star = scrapy.Field()
    #評價數
    evaluate = scrapy.Field()
    #描述
    describe = scrapy.Field()

三、制作爬蟲

        編寫douban_spider爬蟲文件

# -*- coding: utf-8 -*-
import scrapy
from douban.items import DoubanItem

class DoubanSpiderSpider(scrapy.Spider):
    #爬蟲名,不能跟項目名稱重復
    name = 'douban_spider'
    #允許的域名,域名之內的網址才會訪問
    allowed_domains = ['movie.douban.com']
    #入口url,扔到調度器里邊
    start_urls = ['https://movie.douban.com/top250']
#默認解析方法
    def parse(self, response):
        #循環電影的條目
        movie_list = response.xpath("//div[@class='article']//ol[@class='grid_view']//li")
        for i_item in movie_list:
            #item文件導進來
            douban_item = DoubanItem()
            #寫詳細的xpath,進行數據的解析
            douban_item['serial_number'] = i_item.xpath(".//div[@class='item']//em/text()").extract_first()
            douban_item['movie_name'] = i_item.xpath(".//div[@class='info']//div[@class='hd']//a//span[1]/text()").extract_first()
            content= i_item.xpath(".//div[@class='info']//div[@class='bd']//p[1]/text()").extract()
            #多行結果需要進行數據的處理
            #douban_item['introduce'] = ''.join(data.strip() for data in content)
            for i_content in content:
                content_s = "".join(i_content.split())
                douban_item['introduce'] = content_s
            douban_item['star'] = i_item.xpath(".//div[@class='star']//span[@class='rating_num']/text()").extract_first()
            douban_item['evaluate'] = i_item.xpath(".//div[@class='star']//span[4]/text()").extract_first()
            douban_item['describe'] = i_item.xpath(".//p[@class='quote']//span/text()").extract_first()
            #將數據yield到piplines中
            yield douban_item
        #解析下一頁規則,取的后一頁的xpath
        next_link = response.xpath("//span[@class='next']//a//@href").extract()
        if next_link:
            next_link=next_link[0]
            #yield url到piplines中,回調函數callback
            yield scrapy.Request("https://movie.douban.com/top250"+next_link,callback=self.parse)

      

四、存儲內容

將數據存儲為JSON格式:scrapy crawl douban_spider -o test.json

將數據存儲為CSV格式:scrapy crawl douban_spider -o test.csv【生成的CSV文件直接打開會是亂碼,先利用Notepad++工具打開,編碼格式改為utf-8保存再重新打開即可】

將數據保存到monogo數據庫中:

 

# -*- coding: utf-8 -*-
import pymongo
mongo_db_collection
# 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 DoubanPipeline(object):
#創建數據庫連接 def __init__(self): host = '127.0.0.1' port = 27017 dbname = 'douban' sheetname = 'douban_movie' client = pymongo.MongoClient(host=host, port=port) mydb = client[dbname] self.post = mydb[sheetname]
#插入數據 def process_item(self, item, spider): data = dict(item) self.post.insert(data) return item

       打開settings文件的USER_AGENT選項,刪除里邊內容,到網站找一個正確的USER_AGENT粘貼進來。【方法:打開豆瓣top50網站,按F12開發者選項,選擇Network-All,刷新頁面,選擇top250,右側Headers最下邊即為USER_AGENT,如下圖所示】

       打開settings文件的ITEM_PIPELINES 

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 
ITEM_PIPELINES = {
   'douban.pipelines.DoubanPipeline': 300,
}

       設置啟動文件

       在douban文件下新建一個main.py文件,作為爬蟲的啟動文件,避免到命令窗口啟動爬蟲項目。

main文件內容如下:

from scrapy import cmdline
cmdline.execute('scrapy crawl douban_spider'.split())


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM