scrapy爬取數據的基本流程及url地址拼接

說明:初學者,整理後方便能及時完善,冗餘之處請多提建議,感謝!
 
瞭解內容:
Scrapy :抓取數據的爬蟲框架
 
 
異步與非阻塞的區別
 
異步:指的是整個過程,中間若是是非阻塞的,那就是異步過程;
非阻塞:關注拿到結果以前的狀態 (若是拿到結果前在等待,是阻塞,反之,是非阻塞)
 
 
理解:
Scrapy 基本工做流程(簡單--->複雜)
                            

            
                 每一個模塊間不通信,模塊之間經過引擎進行數據傳輸

 

 
   
 基本使用
 
1、建立spider
 
scrapy項目流程
---建立項目
    ---scrapy startproject  xxxx
---建立爬蟲
    ---cd 項目目錄下
    ---scrapy genspider   aaa    allowed_domains"」
        scrapy genspider  first_spider   jpdd.com
      first_spider   爬蟲名字
      jpdd.com     限制爬取數據的範圍
--完善spider
    ---提取數據,提取url地址構成request對象
        xpath  extract_first()\extract()   response.meta      yield  scrapy.Requeest       
--完善管道 
--運行爬蟲
    --- cd  項目目錄   
    ---scrapy  crawl   first_spider
 
注意:避免爬蟲名和項目名重複 ;
           無論在終端仍是pycharm 都要切換到當前目錄下 cd myspider
            allowed_domains : 限定爬取的範圍
           
2、完善spider 
 
    ----  對數據的提取
    一、 Scray 中的parse 作什麼用途? 
            ---處理start_urls 中的url地址的響應
 
    2 、yiele 生成器的使用
             好處:遍歷函數的返回值的時候,挨個把數據讀到內存,不會形成內存的瞬間佔用太高
             經過yield傳遞數據給管道,(相似轉發)
             yield可以傳遞的對象只能是:BaseItem, Request, dict, None
    
    3 、使用.extract()把response.xpath()提取的數據轉化爲字符串列表
            .extract()    返回一個含有字符串的列表,沒有返回空列表
            .extract_first()   提取列表中的第一個字符串,若是不存在,返回None
 
----例:
yield的使用:使用多個yield 來傳遞須要的數據
 

 

  
 
 
 
 
 
 
         
 

上面的代碼應該改爲:yield itempython

 
四、 根據Response返回的url地址,對next_url的url地址進行拼接,構造請求,有5種方式
 
        第1種:手動字符串相加
        第2種:urllib.parse.urljoin(baseurl,url)  後面的url會根據baseurl進行url地址的拼接
        第3種:response.follow(url ,callback)   可以根據response的地址把url拼接完整,構形成Request對象,
                                                                      但這個方法在python 1.0後的版本中才有
        第4種( 推薦):response.urljoin(next_url)     更簡潔、好用
        第5種:scrapy.Request(url,callback,meta,dont_filter)
 
---例:
# 第一種:手動拼接下一頁url
 
#主站連接 用來拼接
    base_site = 'https://www.jpdd.com'

def parse(self,response):
    book_urls = response.xpath('//table[@class="p-list"]//a/@href').extract()

    for book_url in book_urls:
         url = self.base_site + book_url
         yield scrapy.Request(url, callback=self.getInfo)    

    #獲取下一頁
    next_page_url = self.base_site + response.xpath(
            '//table[@class="p-name"]//a[contains(text(),"下一頁")]/@href'
            ).extract()[0]

    yield scrapy.Request(next_page_url, callback=self.parse)
 
使用urllib實現url地址拼接的原理:
        

 

        
 
 
 
 

 

3、完善管道 
       
  管道的設置也是以鍵值的形式
 
      

 

 
 
 
 
 
 
 
數據保存:能夠是具體的item,也能夠保存在文件中,以下2種方式
 
 第一種:
        
     
 
 
 
 
 
 
 
 
 
 
 
第二種:

  ------數字越小,表示離引擎越近,數據越先通過處理,反之 。mongodb

  -------使用多個管道時,前面的管道中要記得return  xx  否則後面的管道接收不到前面的數據,會返回none
 
4、item的使用
        
         爲何要單獨定義item?
            定義item即提早規劃好哪些字段須要抓取,scrapy.Field()僅僅是提早佔坑,經過item.py可以讓別人清楚本身的爬蟲是在抓取什麼數據;
       同時來提示哪些字段是須要抓取的,沒有定義的字段不能使用,防止手誤;
    item不能直接存入mongodb中,須要轉化爲字典後再存儲。
 
      Item使用以前須要先導入而且實例化,以後的使用方法和使用字典相同
    from yanguan.items import YanguanItem
    item = YanguanItem() #實例化

  

補充:
構造翻頁請求
        meta 自身是個字典
          Scrapy.Request() ===>至關於構造了一個requests對象
 
scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])

參數說明:
括號中的參數爲可選參數
callback:表示當前的url的響應交給哪一個函數去處理
meta:實現數據在不一樣的解析函數中傳遞,meta默認帶有部分數據,好比下載延遲,請求深度等
dont_filter:默認會過濾請求的url地址,即請求過的url地址不會繼續被請求,對須要重複請求的url地址能夠把它設置爲Ture,好比貼吧的翻頁請求,頁面的數據老是在變化;start_urls中的地址會被反覆請求,不然程序不會啓動cookie

相關文章
相關標籤/搜索