-
Python Scrapy抓取数据中文存utf8乱码问题
继 http://blog.wdoc.info/note/79.html (在回调函数中加载新页面XPath)之后
最近出现了 网页GB2312编码,无法正常转换为utf8存入数据库的问题
网上大肆搜寻一番,说的编码转换一一试过,似乎问题不太好解决
于是直接在命令行下 使用python >>>scrapy shell http://my.test.url
加载页面之后输出类容 来看了下 (截取了一部分)测试片段 如下
>>>tt = "\xe6\x98\xaf\xe4\xb8\x80\xe5\xae\xb6\xe4\xb8\x93\xe4\xb8\x9a\xe9\x94\x80\xe5\x94\xae\xe3\x80\x8a\xe9\x93\x85\xe9\x85\xb8\xe5\x85\x8d\xe7\xbb\xb4\xe6\x8a\xa4\xe8\x93\x84\xe7\x94\xb5\xe6\xb1\xa0\xe3\x80\x8b\xe3\x80\x81\xe3\x80\x8aUPS\xe4\xb8\x93\xe7\x94\xa8\xe8\x93\x84\xe7\x94\xb5\xe6\xb1\xa0\xe3\x80\x8b\xe3\x80\x81\xe3\x80\x8a\xe7\x9b\xb4\xe6\xb5\x81\xe5\xb1\x8f\xe4\xb8\x93\xe7\x94\xa8\xe8\x93\x84\xe7\x94\xb5\xe6\xb1\xa0\xe3\x80\x8b\xe3\x80\x81\xe3\x80\x8aEPS\xe4\xb8\x93\xe7\x94\xa8\xe8\x93\x84\xe7\x94\xb5\xe6\xb1\xa0\xe3\x80\x8b\xe3\x80\x81\xe3\x80\x8a\xe5\xa4\xaa\xe9\x98\xb3\xe8\x83\xbd\xe4\xb8\x93\xe7\x94\xa8\xe8\x93\x84\xe7\x94\xb5\xe6\xb1\xa0\xe3\x80\x8b\xe3\x80\x81\xe3\x80\x8a\xe9\x93\x85\xe9\x85\xb8\xe5\x85\x8d\xe7\xbb\xb4\xe6\x8a\xa4\xe8\x93\x84\xe7\x94\xb5\xe6\xb1\xa0\xe3\x80\x8b\xe3\x80\x81\xe3\x80\x8a\xe8\x83\xb6\xe4\xbd\x93\xe8\x93\x84\xe7\x94\xb5\xe6\xb1\xa0\xe3\x80\x8b\xef\xbc\x8c\xe5\x8c\x85\xe6\x8b\xac\xe5\xae\x89\xe8\xa3\x85\xe3\x80\x81\xe8\xb0\x83\xe8\xaf\x95\xe5\x8f\x8a\xe7\xbb\xb4\xe4\xbf\xae..."
>>>print tt
直接乱码
>>>print tt.decode('utf8','ignore')
显示正常中文(ignore 在解码过程中直接忽略异常编码)
但是在Scrapy中
temp = urllib2.urlopen(newurl) #请求
temp = temp.read() #读数据temp = temp.decode('utf8','ignore') # 这样会提示找不到默认编码...
newresponse = HtmlResponse(newurl)
newresponse._set_body(temp)于是最终解决方案
temp = temp.decode('utf8','ignore').encode('gbk')
#过程比较潦草,仅做记录 欢迎指正
#如果对python 如何使用Scrapy加载网页不熟悉的朋友,请先参阅 http://blog.vsfor.com/note/79.html
-
Scrapy在回调函数中直接请求新页面XPath
使用Scrapy抓取数据时,往往需要将多个页面的内容拼凑到一起然后保存
具体的需求情况就不啰嗦了
如下是简单的测试代码
#在函数中请求加载 新页面,片段代码
from scrapy.http import Request,HtmlResponse #载入相关类,如果头部有可以直接移除
from scrapy.selector import HtmlXPathSelector #同上
import urllib2 #同上
newurl = 'http://www.baidu.com' #新页面的url (必须是包含协议名称的完整url)
temp = urllib2.urlopen(newurl) #请求
temp = temp.read() #读数据
newresponse = HtmlResponse(newurl)
newresponse._set_body(temp)
temp = HtmlXPathSelector(newresponse) #构建新的xpath选择器
print temp.select('//title/text()').extract()[0] #测试欢迎留言交流
-
Scrapy使用cx_Oracle插入数据时中文乱码问题
使用Python的爬虫框架Scrapy时 往往需要将爬到的数据保存到数据库
而这边用的是Oracle,环境配置之类的网上很多这边就不赘述了
编码中涉及中文时 python文件开头添加 ##coding=utf-8 是必不可少的
乱码解决:
Linux 环境下,设置环境变量
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
同理Windows环境下 乱码也跟这个没有设置的环境变量有关,但是并不是这样解决的
Windows主要是通过os 模块修改环境变量,解决参考代码如下
##coding=utf-8
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/topics/item-pipeline.html
import cx_Oracle
import os
os.environ['NLS_LANG']="AMERICAN_AMERICA.AL32UTF8"当然网络上也有 os.environ['NLSLANG'] = 'SIMPLIFIED CHINESECHINA.UTF8' 的配置方案,如有同样问题,就测测看吧:)