【Scrapy學習心得】爬蟲實戰一(入門案例)

【Scrapy學習心得】爬蟲實戰一(入門案例)

聲明:僅供技術交流,請勿用於非法用途,如有其它非法用途造成損失,和本博客無關

爬取的網站:東莞陽光網問政平臺中的投訴頁面 點擊跳轉

一、配置環境

  • python3.7
  • pycharm
  • Scrapy1.7.3
  • win10
  • pymysql

二、準備工作

  • 在cmd命令行中進入需要創建項目的目錄運行scrapy startproject tutorial
  • 創建成功後繼續執行cd yg
  • 然後執行scrapy genspider yg sun0769.com
  • 最後在spider文件夾下可以看到剛創建的yg.py爬蟲文件

三、分析網頁


可以看到,這是一個很簡單的網頁而已,非常容易爬取數據,在這個頁面我只想要它的標題以及標題對應詳情頁面的url和時間,然後隨便進入其中一個標題內容的詳情頁面,如下:

然後這個詳情頁面我只想要它的文本內容,即提問的這個人所寫的具體信息。不過可以發現有一些會有上傳圖片,例如:

那麼我也想把它的圖片拿下來,這裏我只把圖片的url爬取下來了

所以總共我要爬取的內容有:

  1. 一開始的頁面裏的標題
  2. 標題詳情頁面的url地址
  3. 時間
  4. 詳情頁面裏的圖片url地址
  5. 詳情頁面裏的內容

在此,我們在yg項目目錄下的item.py文件裏可以先定義如下:

import scrapy

class TutorialItem(scrapy.Item):
    title = scrapy.Field()  #標題
    url = scrapy.Field()    #標題詳情頁面url
    date = scrapy.Field()   #時間
    img_url = scrapy.Field() #圖片url
    content = scrapy.Field() #內容

可以說item.py文件在scrpy框架爬蟲中是最簡單好寫的一個,沒有之一,並且我感覺它是可有可無的,因爲你可以在爬蟲文件中自己定義一個item變量字典用來保存爬取的數據,都是一樣的結果,只是用item.py會顯的更加裝13專業一點,哈哈

查找元素的那些操作我就不放上來了,因爲沒什麼難度的,會來學scrapy框架的同學肯定是跟我一樣那些什麼requests啊,urllib啊,selenium啊等等都是用膩了纔來的,是吧

四、爬取數據

下面直接放上yg.py的代碼:

# -*- coding: utf-8 -*-
import scrapy
from tutorial.items import TutorialItem  #需要導入item文件中的創建的類


class YgSpider(scrapy.Spider):
    name = 'yg'
    allowed_domains = ['sun0769.com']
    start_urls = ['http://d.wz.sun0769.com/index.php/question/questionType?type=4']

    def parse(self, response):
        tr_list=response.xpath('//div[@class="greyframe"]/table[2]/tr/td/table/tr')
        for tr in tr_list:
            item=TutorialItem()
            item['title']=tr.css('a::attr(title)').get()
            item['url']=tr.css('a::attr(href)')[1].get()
            item['date']=tr.xpath('./td[last()]/text()').get()
            #下面是發送去詳情頁面的請求
            yield scrapy.Request(
                item['url'],
                callback=self.parse_detail,  #讓返回的response交給這個函數處理,注意:不要帶上括號
                meta={'item':item}  #並且把上面爬到的標題等內容一起傳過去
            )
        #下面是進行翻頁的操作
        next_page=response.xpath('//a[text()=">"]/@href').get()
        if next_page is not None:
            yield scrapy.Request(next_page,callback=self.parse)

    def parse_detail(self,response):
        item=response.meta['item'] #接受傳進來的item
        item['content']=response.xpath('//td[@class="txt16_3"]/text()').getall()
        item['img_url']=response.xpath('//td[@class="txt16_3"]//img/@src').getall()
        #下面處理圖片url
        item['img_url']=['http://wz.sun0769.com' + i for i in item['img_url']]
        item['img_url']=''.join(i for i in item['img_url'])
        yield item  #會傳給pipeline.py進行保存數據的操作

五、保存數據

保存數據是交給pipeline.py文件進行操作的

這裏我把數據保存到了mysql數據庫中,如果沒有安裝pymysql的,可以在cmd命令下執行pip install pymysql來安裝一下即可
然後pipeline.py文件的代碼如下:

# -*- coding: utf-8 -*-
import pymysql

class TutorialPipeline(object):
	#爬蟲開始時運行的函數
    def open_spider(self,spider):
        print('爬蟲開始...')
        conn = pymysql.connect(host='localhost', user='youruser', password='yourpassword', database='yourdatabase', charset='utf8')
        cursor = conn.cursor()
	
	 #接收傳入的item,來進行數據的存儲
    def process_item(self, item, spider):
        if spider.name == 'yg':
            item['content']=self.process_content(item['content'])
            title=item['title']
            url=item['url']
            date=item['date']
            content=item['content']
            img_url=item['img_url']
            sql='insert into yg(title,url,date,content,img_url) values(%s,%s,%s,%s,%s)'
            cursor.execute(sql, [title,url,date,content,img_url])
            conn.commit()
            
	#因爲傳進來的content需要清洗處理一下,因此定義下面的函數
    def process_content(self,content):
        content=[re.sub(r"\xa0|\s","",i) for i in content]
        content=[i for i in content if len(i)>0]
        content=[i.strip() for i in content]
        content=''.join(i for i in content)
        # content=''.join(content).strip()
        return content
	
	#爬蟲結束後會運行的函數
    def close_spider(self,spider):
        print('爬蟲結束...')
        cursor.close()
        conn.close()

現在我們的爬蟲大致已經是寫完了,不過我還要修改一下setting.py文件的一些設置,需要增加的語句有:

LOG_LEVEL='WARNING' #設置日誌輸出級別
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'  #設置請求頭
ROBOTSTXT_OBEY = False  #把這個設置成False,就不會去請求網頁的robots.txt,因爲不改爲False的話,scrapy就會去訪問該網站的robots.txt協議,如果網站沒有這個協議,那麼它就不會去訪問該網站,就會跳過,進而爬不到數據
ITEM_PIPELINES = {
   'tutorial.pipelines.TutorialPipeline': 300,  #打開剛剛設置的pipeline.py
}

最後在cmd中先進入到這個項目的根目錄下,即有scrapy.cfg文件的目錄下,然後輸入並運行scrapy crawl yg,最後靜靜等待就行了

打開數據庫你會看到:

寫在最後

到現在爲止,我接觸python爬蟲也差不多有半年了吧,不是接觸,是開始學,因爲之前都沒有爬取過數據,都在做數據分析的工作。然後呢,一開始我就從圖書館借了幾本python爬蟲的書來看,都是一些比較基礎的入門級別的書,當時還有課,只是在空閒的時間裏學,偶爾在一些比較無聊的課的時候會帶過去看,也不知道爲什麼,看着看着就覺得很有趣,就會去敲敲代碼自己爬一下玩玩,爬着爬着就好像懂得了一些爬蟲的原理吧,於是趁着放暑假,就從圖書館又借了幾本發佈時間不久的比較新的系統一點的書,回到家就把那幾本書給看完了,並且是一個案例都不放過的那種,從一開始的urllibrequests,再到selenium,全部都學完了,也不是學完吧,就大致都知道怎麼用,也可以很好的結合在一起使用,現在是運用自如。最近呢,想了想,好像還差點什麼東西,是什麼呢,毫無疑問就是框架啊,到現在我一個爬蟲的框架都沒有學過,於是就開始學非常非常熱門的scrapy了,也學了有一段時間了,沒算錯的話應該有3個星期了。然後呢,學到現在,大概是知道了scrapy的一些原理,以及怎麼使用它了,也知道了它的一些優點和缺點。又因爲最近時間有點兒充裕,而且朋友也問我爲什麼不寫寫博客之類的啊,記錄一下也好啊。於是乎,就有了這一篇文章。後續我會繼續寫scrapy的一些爬蟲案例,並且記錄一下當下的一些心得體會,與大家分享一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章