Scrapy爬蟲入門實例

網上關於Scracpy的講述已經很是豐富了,並且還有大神翻譯的官方文檔,我就不重複造輪子了,本身寫了一個小爬蟲,遇到很多坑,也學到很多東西,在這裏給你們分享一下,本身也作個備忘錄。php

主要功能就是爬取cnvd漏洞庫每一個漏洞的名稱、發佈時間,漏洞描述,漏洞編號...python

先說下個人環chrome

Ubuntu 16.04
python 2.7
scracpy 1.0.3

 一、Scracpy的如何自定義UA?shell

由於某些網站有根據ua作反爬機制,Scracpy已經爲咱們定義好了處理機制,首先在settings.py中設置處理request的類,而後實現類便可。數據庫

settings.py中增長以下內容dom

#網上找代碼,有侵權請通知
WNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
    #工程名(cnvd)、類文件名(middlewares)、文件中類名(RotateUserAgentMiddleware)
    'cnvd.middlewares.RotateUserAgentMiddleware':400,
}

在同目錄下新建文件Middlewares.py,代碼以下scrapy

#網上找的代碼,有侵權請告知

#!/usr/bin/python  
#-*-coding:utf-8-*-  
  
import random  
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware  
  
class RotateUserAgentMiddleware(UserAgentMiddleware):  
    def __init__(self, user_agent=''):  
        self.user_agent = user_agent  
  
    def process_request(self, request, spider):  
        #隨機選擇list中的ua
        ua = random.choice(self.user_agent_list)  
        if ua:  
            #設置request頭部中的ua信息
            request.headers.setdefault('User-Agent', ua)  
  
    #the default user_agent_list composes chrome,I E,firefox,Mozilla,opera,netscape  
    #for more user agent strings,you can find it in http://www.useragentstring.com/pages/useragentstring.php  
    user_agent_list = [\  
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"\  
        "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",\  
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",\  
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",\  
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",\  
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",\  
        "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",\  
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",\  
        "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",\  
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",\  
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",\  
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",\  
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",\  
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",\  
        "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",\  
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",\  
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",\  
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"  
       ]  

二、Scracpy中log怎麼用?ide

在網上搜索和官方例子中用的是log.msg("log msg", level=DEBUG),可是本身使用的時候提示該方法已經被廢棄,建議使用python的logging模塊。使用方法以下函數

import logging

logging.debug("msg")

三、yield什麼意思測試

我對python也是隻知其一;不知其二,一直不明白這個是怎麼個用法,也說很差,看代碼註釋吧

#Scracpy會自動向url發一個請求,並使用index_parse解析response
yield scrapy.Request(url, callback=self.index_parse)
#實現回調函數
def index_parse(self, response):

四、Xpath的一些小知識

#得到a標籤的href屬性值
response.xpath(//tr[@class='current']/td/a/@href)
#查找文本是xxx的標籤/對與查找漢字,須要在字符串前加u
response.xpath(u"//td[text()='漏洞描述'])
#找到當前節點的全部兄弟節點
response.xpath(u"//td[text()='漏洞描述']/following-sibling::*")

測試xpath的方法:

一、使用scracpy shell url,會返回一個交互終端,可使用response.xpath("")查看該url頁面的匹配結果。我的不喜歡這種方式,終端操做,很差看。

二、使用firefox插件WebDriver Element Locator,安裝以後,當在頁面選中元素右擊,能夠看到該元素的xpath,然並卵,大多時候不是咱們想要的方式

三、使用firefox插件firebug,firexpath,在firebug頁面會出現一個firepath的框,輸入xpath能夠測試匹配是否成功,我的比較喜歡這種方式

五、數據庫操做

直接上數據庫操做的代碼

import logging
from cnvd.items import CnvdItem
import MySQLdb
import MySQLdb.cursors

class CnvdPipeline(object):
    def __init__(self):
        self.conn = MySQLdb.connect(user='root', passwd ='123456', db='cnvddb', host='localhost', charset='utf8')
        self.cursor = self.conn.cursor()
        self.cursor.execute("truncate table cnvd")
        self.conn.commit()
    def process_item(self, item, spider):
        self.cursor.execute("insert into cnvd(cnvd_id, name, time, description) values(%s, %s, %s, %s)", 
                           (item['cnvd_id'], item['name'], item['time'], item['description']))
        self.conn.commit()
        logging.debug(item['name']) 
        logging.debug(item['cnvd_id']) 
        logging.debug(item['time']) 
        return item

 

總結:

曾經使用urllib2寫過一個爬蟲爬cnnvd上的漏洞庫,爬了一天發現網站漏洞頁面不能訪問來,用手機4G能夠訪問,猜想是把公司的ip加入黑名單來,原本想用scracpy再實現一個,奈何頁面打不開,很差調試。因而選擇來cnvd這個漏洞庫,不過測試也僅僅是用了一頁,沒有全爬,擔憂再被拉黑。各位測試的時候最好也注意一下。。。

 附件是完整的代碼,僅僅是一個小demo,後來要作的還有數據庫查重,反反爬,漏洞其餘信息的爬取等等,可是做爲一個demo,夠用了

 完整代碼

相關文章
相關標籤/搜索