網上關於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,夠用了