Python最常见的爬虫框架就是Scrapy了。这种框架的优点就是把写爬虫变成了一个填空题,非常简单易用。然而其缺点也在于填空题是受约束的,灵活性不够。也就是说Scrapy这种重量级的框架在面对一些特别的爬虫任务时,需要的修改甚至更加繁琐。因此,我选择了urllib2和BeautifulSoup两个模块来直接实现爬虫。下面是实验过程中遇到的一些问题:
中文URL问题
首先是中文问题,要在.py文件里加入下面的代码
#coding=utf-8
import sys
if sys.getdefaultencoding() != 'utf-8':
reload(sys)
sys.setdefaultencoding('utf-8')
此时,python已能处理中文,但是response = urllib2.urlopen(url)中的url如果含有中文,将无法获取正确的网页内容。 经过多次试验,发现必须将URL中的中文部分单独拿出来进行quote处理,将其变为“%E7%BC%96%E7%A0%81”的形式,再放回URL替代中文即可。
type = urllib2.quote("玄幻")
url = "https://www.qidian.com/finish?tag=" + type + "&action=hidden&orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=2&page=1"
response = urllib2.urlopen(url)
SQLite 使用8-bit字节字符串
SQLite是一种非常简单好用的嵌入式数据库,用于存储爬虫抓取的少量数据非常适合。 在存储抓取的网络数据时遇到的一个错误如下:
ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.
修改方式就是连接数据库时,增加一句conn.text_factory = str
conn = sqlite3.connect(DBname)
conn.text_factory = str
cur = conn.cursor()
SQLite 常用命令
在命令行输入sqlite3 databasefilename 检查databasefilename是否存在,如果不存在就创建并进入数据库,如果已经存在直接进入数据库,对数据库进行操作。
在sqlite中的命令以.开头,大小写敏感(数据库对象名称是大小写不敏感的):
.exit
.help 查看帮助 针对命令
.database 显示数据库信息;包含当前数据库的位置
.tables 或者 .table 显示表名称 没有表则不显示
.schema 命令可以查看创建数据对象时的SQL命令;
.schema databaseobjectname查看创建该数据库对象时的SQL的命令;如果没有这个数据库对象就不显示内容,不会有错误提示
.read FILENAME 执行指定文件中的SQL语句
以及所有SQL语句,注意SQL语句结尾用;