天天看點

網絡爬蟲-格言網全站資料(scrapy)

人生就應該多讀一點雞湯→傳送門 : 格言網

網絡爬蟲-格言網全站資料(scrapy)

好了廢話不多說,直接上幹活,今天是如何利用scrapy架構爬取格言網的全站資料并存儲至本地.如何安裝配置scrapy環境請看我的另一篇文章:Scrapy環境搭建

首先是建立一個scrapy架構的整體結構,這裡就不做詳細解釋了.

網絡爬蟲-格言網全站資料(scrapy)

這樣一個整體的架構就建構出來了.

items.py:

(明确需要儲存的字段,title 标題,url 标題對應的位址,content 雞湯)

import scrapy


class GeyanItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    url = scrapy.Field()
    content = scrapy.Field()
           

spiders→mingju.py:

(你的爬蟲,如何爬取内容取決于這個)

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from geyan.items import GeyanItem

class MingjuSpider(CrawlSpider):
    name = 'mingju'
    allowed_domains = ['https://geyanw.com/']
    start_urls = ['https://geyanw.com'] # 網址初始位址

    def parse(self, response):
        # i = {}
        #i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
        #i['name'] = response.xpath('//div[@id="name"]').extract()
        #i['description'] = response.xpath('//div[@id="description"]').extract()
        # return i

        foo = response.xpath('//*[@id="p_left"]/div/dl/dd/ul/li') # xpath比對需要爬取的内容
        for i in foo:
            item = GeyanItem() # 每一次都需要新執行個體化item 否則就會出現标題和url被最後擷取的資料覆寫的情況
            item['title'] = i.xpath('a/text()').extract_first() # extract()取出清單, extract_first()為單個資料
            # url = 'https://geyanw.com/' + i.xpath('dd/ul/li[1]/a/@href').extract_first()
            url = response.urljoin(i.xpath('a/@href').extract_first())
            item['url'] = url
            request = scrapy.Request(url=url, callback=self.content, dont_filter=True) # 同使用response.follow()方法
            request.meta['item'] = item # 指定response給下一個方法, 對應需要取出的每一個資料
            yield request


    def content(self, response):
        item = response.meta['item'] # 比對對應的資料
        bar = response.xpath('//*[@id="p_left"]/div[1]/div[4]/p')
        mystr = ''
        for i in bar:
            mystr += i.xpath('text()').extract_first() # 拼接字元串内容
        item['content'] = mystr
        yield item
           

簡單的爬取格言網内容的爬蟲就大功告成了

最後還需要改一下setting配置,将user-agent改成浏覽器核心,常見的防反爬手段

setting.py:

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)' \
             ' Chrome/68.0.3423.2 Safari/537.36'
           

最後就是在控制台運作爬蟲了:

網絡爬蟲-格言網全站資料(scrapy)

最終效果(json格式的内容需要在菜鳥工具裡轉換後檢視)→ json格式化菜鳥工具:

網絡爬蟲-格言網全站資料(scrapy)
網絡爬蟲-格言網全站資料(scrapy)

這樣就使用scrapy架構完成了一個最簡單的爬取網站的功能!