选择爬取网站为 http://www.qiushibaike.com/
翻页之后我们可以看到网址变化为http://www.qiushibaike.com/8hr/page/2/?s=4908225
也就是说,其page的变化决定了我们要爬取第几页糗百
因此url为
url = 'http://www.qiushibaike.com/8hr/page/%d/?s=4908218' %pagepage可以自己定,固定的数字,乃至for循环爬取多页,此次初体验先爬取第一页
page = 1 url = 'http://www.qiushibaike.com/8hr/page/%d/?s=4908218' %page爬虫采用urllib,urllib2库来帮助获取回应的网页
于是,代码初步就出来了
import urllib import urllib2 page = 1 url = 'http://www.qiushibaike.com/8hr/page/%d/?s=4908218' %page request = urllib2.Request(url) response = urllib2.urlopen(request) print response.read()但是 发现出现Traceback (most recent call last)错误,此错误常见有网页拒绝非人工(比如爬虫)访问、空间不够等。此处是因为网站检测到非法访问,拒绝了。
所以设置headers
user_agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" headers = { 'User-Agent' : user_agent }此处需要了解的是:
request(url,data,headers),data,heardes的默认参数以及什么时候需要使用
获取headers,user-agent,乃至cookies,proxy的方法(网页F12)
user_agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" headers = { 'User-Agent' : user_agent } request = urllib2.Request(url,headers=headers)因此代码变成了如下模样
import urllib import urllib2 page = 1 url = 'http://www.qiushibaike.com/8hr/page/%d/?s=4908218' %page print url user_agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" headers = { 'User-Agent' : user_agent } request = urllib2.Request(url,headers=headers) response = urllib2.urlopen(request) result=response.read() print result
运行成功
但是与原网页的源代码对比,发现 中文字符出现乱码(LINUX下正常显示)
是因为Python的编码问题,初步想法是通过正确的解码方式解决乱码问题,通过F12看到是utf-8编码,因此
response.read().decode("utf-8")
import urllib import urllib2 page = 1 url = 'http://www.qiushibaike.com/8hr/page/%d/?s=4908218' %page print url user_agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" headers = { 'User-Agent' : user_agent } request = urllib2.Request(url,headers=headers) response = urllib2.urlopen(request) result=response.read().decode("utf-8") print result
但是出现UnicodeEncodeError: 'gbk' codec can't encode character u'\ufeff' in position 42377: illegal multibyte sequence
感觉很奇怪,页面本身是UTF-8的,然后想要UTF-8解码,结果却提示GBK错误,之后走了一些弯路,暂且不表。
通过查找资料,得知对于此Unicode的字符,需要print出来的话,由于本地系统是Win7中的cmd,默认codepage是CP936,即GBK的编码,所以需要先将上述的Unicode的titleUni先编码为GBK,然后再在cmd中显示出来,然后由于titleUni中包含一些GBK中无法显示的字符,导致此时提示“’gbk’ codec can’t encode”的错误的。
得到解决方案
import urllib import urllib2 page = 1 url = 'http://www.qiushibaike.com/8hr/page/%d/?s=4908218' %page print url user_agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" headers = { 'User-Agent' : user_agent } request = urllib2.Request(url,headers=headers) response = urllib2.urlopen(request) result=response.read().decode("utf-8").encode("GB18030") print result目前为止得到的request跟F12获得的页面内容相同。( LINUX下此方法反而乱码,多此一举)