Python爬虫(1)

中文URL问题和SQLite数据库问题

Posted by LM on April 2, 2018

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语句结尾用;