一、爬取全书网
1)获取源代码,解决编码问题
#!/usr/bin/env python #-*-coding: utf8-*- # python2.7.10 import urllib,urllib2 # python2 爬虫必备的库 def getNovelListUrl(): html = urllib.urlopen('http://www.quanshuwang.com/list/1_1.html').read() # read() 获取源代码的方法 print(html) # li><a href="http://www.quanshuwang.com/book_16860.html" target="_blank">�ܲõ�����С����</a></li> 编码故障 getNovelListUrl()
a)python的执行脚本是uft-8的编码
b)源代码的编码是gdk的编码,网页查看源代码,shift+f 弹出查找对话框,输入 char
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
html = urllib.urlopen('http://www.quanshuwang.com/list/1_1.html').read().decode('gbk').encode('utf-8')
小结:编码的转换
## 编码 乱码的产生 - 乱码的产生:显示的编码和本身不一致 网页编码:gbk 显示的编码:utf-8 str unicode gbk -> unicode -> uft-8 decode:解码:把一种编码转换成unicode encode:编码:把unicode转换成一种编码 encode('gbk').decode('utf-8') encode('utf-8').decode('gbk') decode('gbk').encode('gbk')
2)用正则获取到书的网址,书名,作者
def getNovelListUrl(): html = urllib.urlopen('http://www.quanshuwang.com/list/1_1.html').read().decode('gbk').encode('utf-8') reg = r'<a target="_blank" title=".*?" href="(.*?)" class="clearfix stitle">(.*?)</a>作者:<a href=".*?">(.*?)</a>' # (.*?) 指我们需要获取到的内容,而整句话说明所有的格式一样,,, .*? 不需要的内容,跳过 urllist = re.findall(reg,html) print(urllist)
如果在匹配的正则字段中有 () ,需要在前面 /(/) 转义一下
import urllib,urllib2 # python2 爬虫必备的库 import re def getNovelListUrl(): html = urllib.urlopen('http://www.quanshuwang.com/list/1_1.html').read().decode('gbk').encode('utf-8') reg = r'<a target="_blank" title=".*?" href="(.*?)" class="clearfix stitle">(.*?)</a>作者:<a href=".*?">(.*?)</a>' urllist = re.findall(reg,html) return urllist for noverl in getNovelListUrl(): print(noverl) break
# 获取到需要的url,和书名,作者 # ('http://www.quanshuwang.com/book_118835.html', '\xe7\x81\xab\xe5\xbd\xb1\xe4\xb9\x8b\xe6\x95\x91\xe4\xb8\x96\xe4\xb8\xbb', '\xe8\x8c\x83\xe4\xbb\xaa\xe5\x90\x8c')