码迷,mamicode.com
首页 > 其他好文 > 详细

爬虫2

时间:2018-12-08 22:27:33      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:为什么   自动   cup   nbsp   公司   list   out   pen   分组   

今天杭州市是真的冷,还没来得及感受秋天,冬天突然来了,有点措手不及。

这篇把剩下的写完。

找到要爬取分组的url,我用了正则表达式,re库里的findall()方法,好处是返回是一个list,缺点是返回的list中可能有重复。

list去重是一个很简单,但是可能在各公司面试时比较常见的一个问题。

下面介绍几种解决方法。

1.首先想到的肯定是使用集合set,现将list转换成set,再将set转换成list,去重自动完成。list(set(mylist))

2.第二种是使用keys(),  {}.fromkeys(list).keys()

3.第三种是写循环判断。for i in list1:

            if i not in list2:

              list2.append(i)

下面先粘一段代码:

k=1
while(i):#循环遍历每组图片
artical=re.findall(page_pic_list_regx,page)
ask=str(artical[0])#在html页面中找到主体部分,可以让正则匹配更准确
list2 = re.findall(regx3,ask)#找到本页的图片
for j in list2:
pic_name = t+str(k)+‘.jpg‘#拼保存到本地图片的名字
k=k+1
down_pic(j,pic_name) #将图片保存到本地
next = re.findall(regx1, page) #看看页面是否有下一页按钮
if next:#如果有下一页,页数+1,继续访问下一页
pag_num = pag_num +1

b = pre + ‘_‘ + str(pag_num) + ‘.‘ + ‘html‘
print(b)
page = url_req(b, header)
else:否则本组图片爬完,开始下一组
print(‘group finish‘)
i=[]#将i置空,跳出循环
很简单的代码,但是这个过程中又有2个问题。
1.down_pic()是一个自定义函数,本来只是用简单的urllib.request.urlretrieve(url, pic_path)就可以保存图片到本地。
但是时在一个比较理想的网络环境下,才可以。网络有波动时,脚本因为请求超时卡死。
在网上查解决方案时,有人提出用迭代的方式,请求超时就重新访问。这需要引入一个socket库,使用socket.setdefaulttimeout(10)函数设置全局默认超时时间。
即,超过10秒没有返回,即视为请求失败,抛出异常。
2.图片下载过程中,网络波动,导致下载卡死。
urllib.error库中,有ContentTooShortError,可以抛出特定时间内因为下载不完整的错误。
解决了这两个问题,写的函数长这样:
def down_pic(j,k):
try:
s=1
req.urlretrieve(j, k)
print(k)
except err.ContentTooShortError as e:#图片在特定时间内没有下载完成
print(‘chongxinqingqiu‘)
dwon_pic(j, k)
except socket.timeout:
s=s+1
if s<10:#访问次数设置为10次,超过10次下载仍不成功,直接放弃。
print(‘超时‘)
down_pic(j,k)
else:
print(‘跳过本张图片‘)
except err.URLError:
s=s + 1
if s < 10:
print(‘URL错误‘)
down_pic(j, k)
else:
print(‘跳过本张图‘)
except Exception:
print(‘跳过本张图‘)
之后再研究下使用多进程来下载。
为什么用多进程而不用多线程呢。网上有很多解答,大致意思是,python有个假的多线程,只是用了cup的一个核心。所以,在处理IO比较多的问题时,效率并不太高。
由于这部分待学习,所以给自己先定个时间吧,下周六要弄完。

爬虫2

标签:为什么   自动   cup   nbsp   公司   list   out   pen   分组   

原文地址:https://www.cnblogs.com/marseilles/p/10089021.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!