以前寫了一篇用scrapy框架爬取本身博文的博客,後來發現對於中文的處理一直有問題- -html
顯示的時候 [u'python\u4e0b\u722c\u67d0\u4e2a\u7f51\u9875\u7684\u56fe\u7247 - huhuuu - \u535a\u5ba2\u56ed'] 而不是 python下爬某個網頁的圖片 - huhuuu - 博客園。這顯然不是咱們須要的結果。python
如今如何把列表中的字符串轉到字符串,顯然不能直接用str! 那就遍歷列表,把信息提取出來。app
def change_word(s): #把表中的字符串轉化到中文顯示 print s sum = 0 for i in s[0]: sum += 1 ss2 = '' count = 0 for i in range(0,sum): ss2 += s[0][i] s = ss2 print s
運行一下,彷佛是能夠的,可是發現有些字符仍是沒有轉化到中文字符,查了下編譯器的提示:框架
\u2014這個字符好像支持的很差,那就把這個字符除掉dom
一開始沒搞明白字符的單位是什麼,判斷條件寫成了,天然就沒起到任何做用scrapy
if (s[0][i] == '\\') and (s[0][i+1] == 'u'): if (s[0][i+2] == '2') and (s[0][i+3] == '0') and (s[0][i+4] == '1') and (s[0][i+5] == '4'):
原來在python中對中文字符 與 對英文字符 都看作一個單位,因此:ide
if (s[0][i] == u'\u2014'): continue
最後,能夠正確的顯示因此中文字符了。url
完整的spider代碼:spa
#!/usr/bin/env python #coding=utf-8 from scrapy.contrib.spiders import CrawlSpider,Rule from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from scrapy.selector import Selector from dirbot.items import Website from scrapy.selector import HtmlXPathSelector import sys import string sys.stdout=open('output.txt','w') #將打印信息輸出在相應的位置下 add = 0 def change_word(s): #把表中的字符串轉化到中文顯示 print s sum = 0 for i in s[0]: sum += 1 ss2 = '' count = 0 for i in range(0,sum): #對 /u2014處理 if (s[0][i] == u'\u2014'): continue ss2 += s[0][i] s = ss2 print s class DmozSpider(CrawlSpider): name = "huhu" allowed_domains = ["cnblogs.com"] start_urls = [ "http://www.cnblogs.com/huhuuu", ] rules = ( # 提取匹配 huhuuu/default.html\?page\=([\w]+) 的連接並跟進連接(沒有callback意味着follow默認爲True) Rule(SgmlLinkExtractor(allow=('huhuuu/default.html\?page\=([\w]+)', ),)), # 提取匹配 'huhuuu/p/' 的連接並使用spider的parse_item方法進行分析 Rule(SgmlLinkExtractor(allow=('huhuuu/p/', )), callback='parse_item'), Rule(SgmlLinkExtractor(allow=('huhuuu/archive/', )), callback='parse_item'), #之前的一些博客是archive形式的因此 ) def parse_item(self, response): global add #用於統計數量 print add add+=1 sel = HtmlXPathSelector(response) items = [] item = Website() temp = sel.xpath('/html/head/title/text()').extract() item['headTitle'] = temp#觀察網頁對應得html源碼 item['url'] = response #print temp print item['url'] change_word(temp) items.append(item) return items
爬取的結果:code
近四百篇博文