因为是作为笔记写的,所以会很啰嗦,而且代码不会全部展示。。
首先,你要确定一个目标,就是你要爬的网站。我选的就不说了,比较邪恶,需要18岁以下的小僵尸绕路。
选好之后,构思下整个脚本的大致结构。
1.通过网站的查询接口出一组比较感兴趣的话题下的一些分组,获取这些分组URL,存储成一个list.
2.循环访问这些分组的URL.
3.爬取每个分组下的图片。
(1)获取图片的URL,以list存储。
(2) 下载图片。
(3)判断下一页是否存在,如果存在,拼接URL,访问下一页。不存在的话,访问下一组图片。
ok,结构很简单。
然后开始选择工具。
我使用的python版本是3.6,IDE是pycharm,库是urllib.request url.error re socket。
代码中最重要的两个函数urllib.request.Request()和urllib.request.urlopen()
给个敌台链接https://blog.csdn.net/bo_mask/article/details/76067790 讲的蛮好的。我自己研究的之后在写。
urllib.request.urlopen()返回的是网页的 HTTPResposne 类型的对象,使用read()函数读取返回的时候,由于图片的返回方式为byte类型,所以需要decode()转码。
如果转码成‘UTF-8’,可能会出现一个报错‘‘utf-8‘ codec can‘t decode byte 0xcb in position 134: invalid continuation byte’,归根到底是编码的错误。
再网上看到三个解决方式:
1.脚本开头写 #coding: utf-8 ,我这边没管用。
2.变一种编码方式,如decode(‘GBK‘)
3.修改第二个参数errors,decode(encoding,errors),该参数的作用是‘设置不同错误的处理方案’。修改值为‘ignore‘.
小备注:其他可能得值有 ‘ignore‘, ‘replace‘, ‘xmlcharrefreplace‘, ‘backslashreplace‘ 以及通过 codecs.register_error() 注册的任何值。
再提一个小小的点,请求处一般要写一个抛出错误的处理,网络断开之后,直接退出程序。
如:
try:
file = url_req(url,header)
except err.HTTPError as e:
print(‘network mistake: %s‘, e)
exit()
except Exception as e:
print(e)
exit()
有点小累,休息一会儿。
另外纪念一下今天杭州下大雪。
原文:https://www.cnblogs.com/marseilles/p/10088018.html