刚开始自学Python课程,学习到自制单线程小爬虫,利用pip install requests命令安装Python的Requests库(自备梯子,注意如果安装了不同Python版本的话记得先进入对应版本的pip目录)。
安装完后在IDE中就可以调用Requests了。
import requests
于是开始尝试自己的第一个小爬虫,借用Requests库可以很简单地抓取源码:
# -*- coding:utf-8 -*-
import requests
html=requests.get('自己的网站')
print html.text
但这样运行发现网页源码的中文部分全部乱码显示:
<ul>
<li><a href="UpLoadFile/2010719174647.jpg" rel="lightbox[1]" title="�����"><img src="UpLoadFile/2010719174647.jpg" width="97" height="86" alt="�����"><p>�����</p></a></li>
<li><a href="UpLoadFile/2010719191259.jpg" rel="lightbox[1]" title="�����"><img src="UpLoadFile/2010719191259.jpg" width="97" height="86" alt="�����"><p>�����</p></a></li>
<li><a href="UpLoadFile/201071919051.jpg" rel="lightbox[1]" title="�ְ屦����"><img src="UpLoadFile/201071919051.jpg" width="97" height="86" alt="�ְ屦����"><p>�ְ屦����</p></a></li>
<li><a href="UpLoadFile/2010719184616.jpg" rel="lightbox[1]" title="�����"><img src="UpLoadFile/2010719184616.jpg" width="97" height="86" alt="�����"><p>�����</p></a></li>
<li><a href="UpLoadFile/2010719183418.jpg" rel="lightbox[1]" title="ģ�ߵ���"><img src="UpLoadFile/2010719183418.jpg" width="97" height="86" alt="ģ�ߵ���"><p>ģ�ߵ���</p></a></li>
<li><a href="UpLoadFile/201071916438.jpg" rel="lightbox[1]" title="Բ������"><img src="UpLoadFile/201071916438.jpg" width="97" height="86" alt="Բ������"><p>Բ������</p></a></li>
</ul>
在网上查找解决方案,有发现如下几种方法:
import sys
reload(sys)
sys.setdefaultencoding('utf-8') #不推荐
import urllib2 #利用Python的urllib2库抓取网页
import sys
content = urllib2.urlopen("http://www.higis.cn").read() #网站页面是utf-8编码的。
type = sys.getfilesystemencoding() # 关键
print content.decode("UTF-8").encode(type) # 关键
content.encode('GBK')
分析了几种解决方案,看来问题的关键是网页源码与默认的utf-8编码不一致导致。了解了这个解决起来就容易多了。可以发现要抓取的网页源码中显示编码为gb2312
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
所以我们要做的就是在代码中添加一句用于指定编码
html.encoding = 'gb2312'
这样再次运行就能成功显示中文了:
<ul>
<li><a href="UpLoadFile/2010719174647.jpg" rel="lightbox[1]" title="碟形弹簧"><img src="UpLoadFile/2010719174647.jpg" width="97" height="86" alt="碟形弹簧"><p>碟形弹簧</p></a></li>
<li><a href="UpLoadFile/2010719191259.jpg" rel="lightbox[1]" title="波形弹簧"><img src="UpLoadFile/2010719191259.jpg" width="97" height="86" alt="波形弹簧"><p>波形弹簧</p></a></li>
<li><a href="UpLoadFile/201071919051.jpg" rel="lightbox[1]" title="钢板宝塔簧"><img src="UpLoadFile/201071919051.jpg" width="97" height="86" alt="钢板宝塔簧"><p>钢板宝塔簧</p></a></li>
<li><a href="UpLoadFile/2010719184616.jpg" rel="lightbox[1]" title="环形弹簧"><img src="UpLoadFile/2010719184616.jpg" width="97" height="86" alt="环形弹簧"><p>环形弹簧</p></a></li>
<li><a href="UpLoadFile/2010719183418.jpg" rel="lightbox[1]" title="模具弹簧"><img src="UpLoadFile/2010719183418.jpg" width="97" height="86" alt="模具弹簧"><p>模具弹簧</p></a></li>
<li><a href="UpLoadFile/201071916438.jpg" rel="lightbox[1]" title="圆柱弹簧"><img src="UpLoadFile/201071916438.jpg" width="97" height="86" alt="圆柱弹簧"><p>圆柱弹簧</p></a></li>
</ul>
还有一点要说的是,可能有些网站会阻挡爬虫爬取,因此需要简单的伪装下Headers,如:
user_agent={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36'}
html=requests.get('http://www.baidu.com',headers=user_agent)
爬取完网页源码,接下来就可以利用正则表达式等筛选出我们想要的内容。
至此,本人第一篇博客文章到此完成,新手一枚,欢迎大家留言讨论。