簡單的scrapy實例


前天實驗室的學長要求寫一個簡單的scrapy工程出來,之前也多少看了點scrapy的知識,但始終沒有太明白,剛好趁着這個機會,加深一下對scrapy工作流程的理解。由於臨近期末,很多作業要做(其實。。。。。。。。。。。。。。主要還是自己太菜了,嘻嘻),所以決定去搜一個簡單的實例模仿一下。

顯示搜了一個爬取騰訊招聘網了例子(https://www.cnblogs.com/xinyangsdut/p/7628770.html),動手敲完之后無法運行,試着調式,也無法解決。就又去找了一個爬取博客園的(https://www.jianshu.com/p/78f0bc64feb8),這個例子只能爬取第一頁,稍微改了下,可以爬取任意多個頁面。再改的時候,也遇到了一下麻煩。還是對scrapy理解不夠(其實。。。。。。。還是自己太菜,流下了無知的眼淚),不過最好總算是順利完成了。下面,簡單的解剖一下這個例子。

  1. 首先是編寫item文件,根據爬取的內容,定義爬取字段。代碼如下:
    import scrapy
    
    
    class CnblogItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        title = scrapy.Field()  #定義爬取的標題
        link = scrapy.Field()   #定義爬取的連接
  2. 編寫spider文件(這是關鍵),這里命名為cnblog_spider,代碼如下:
    # -*- coding: utf-8 -*-
    import scrapy
    from cnblog.items import CnblogItem
    
    
    class CnblogSpiderSpider(scrapy.Spider):
        name = "cnblog_spider"
        allowed_domains = ["cnblogs.com"]
        url = 'https://www.cnblogs.com/sitehome/p/'
        offset = 1
        start_urls = [url+str(offset)]
    
        def parse(self, response):
    
    
            item = CnblogItem()
    
            item['title'] = response.xpath('//a[@class="titlelnk"]/text()').extract()       #使用xpath搜索
            item['link'] = response.xpath('//a[@class="titlelnk"]/@href').extract()
    
            yield item
    
            print("第{0}頁爬取完成".format(self.offset))
            if self.offset < 10:        #爬取到第幾頁
                self.offset += 1
            url2 = self.url+str(self.offset)    #拼接url
            print(url2)
            yield scrapy.Request(url=url2, callback=self.parse)

     就這部分代碼內容來說,沒什么難於理解的,但如果搞明白整個運行流程的話,對理解scrapy有很大的幫助。

  3. 編寫pipelines文件,用於把我們爬取到的數據寫入TXT文件。
    class FilePipeline(object):
        def process_item(self, item, spider):
    
            data = ''
    
            with open('cnblog.txt', 'a', encoding='utf-8') as f:
                titles = item['title']
                links = item['link']
                for i, j in zip(titles, links):
                    data += i+'     '+j+'\n'
    
                f.write(data)
                f.close()
            return item
  4. 更改setting文件
    ROBOTSTXT_OBEY = False          #一定要把這個參數的值更改為Fals
    DEFAULT_REQUEST_HEADERS = {
       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
       'Accept-Language': 'en',
        #user-agent新添加
        'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
    }
    #新修改
    ITEM_PIPELINES = {
        'cnblog.pipelines.FilePipeline': 300,    #實現保存到txt文件
    
    }
  5. 編寫一個main文件,scrapy是不能在編譯器里面調試的,但我們可以自己寫一個主文件,運行這個主文件就可以像普通的工程一樣在編譯器里調式了。代碼如下
    from scrapy import cmdline
    
    cmdline.execute("scrapy crawl cnblog_spider --nolog".split())       #--nolog是以不顯示日志的形式運行,如果需要看詳細信息,可以去掉

     現在,我們這個例子就算是寫完了,運行main.py,就會生成一個cnblog.Ttxt的文件,里面就是我們爬取下來的內容了。如下圖

最后說一下寫這個例子的收獲與感想:在敲代碼的過程中,發現自己對python一些知識點掌握的還是不夠牢固,甚至是while循環一下子都寫不出來,以后還是寫多點py(別想歪哦)!另外還有一點,有時候真是沒壓力就沒動力,之前學習scrapy時,一直沒寫出來一個能成功運行的例子,這次在學長的要求下,總算成功寫出來了一個。雖然學習之路如此艱難,但絕不應該逃避。加油呀!!!!!

(ps:本人太菜,若有錯誤的地方歡迎大佬隨時責罵。。。。xixixii)


免責聲明!

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



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