请问一个python爬取百度图片卡死的问题

mzccvb 2018-06-14 09:38:20
我在按关键字爬取百度图片的时候总是在爬取到特定图片的时候卡死或出现socket.error: [Errno 104] Connection reset by peer的问题,不同的关键字就是不同的特定图片处卡死,但是图片本身按道理来说应该是没什么问题的。不知道问题出在哪,请大神指教一下,谢谢!
#coding: utf-8
import os
import re
import urllib
import urllib2
import itertools
from string import maketrans

str_table = {
'_z2C$q': ':',
'_z&e3B': '.',
'AzdH3F': '/'
}

char_table = {
'w': 'a',
'k': 'b',
'v': 'c',
'1': 'd',
'j': 'e',
'u': 'f',
'2': 'g',
'i': 'h',
't': 'i',
'3': 'j',
'h': 'k',
's': 'l',
'4': 'm',
'g': 'n',
'5': 'o',
'r': 'p',
'q': 'q',
'6': 'r',
'f': 's',
'p': 't',
'7': 'u',
'e': 'v',
'o': 'w',
'8': '1',
'd': '2',
'n': '3',
'9': '4',
'c': '5',
'm': '6',
'0': '7',
'b': '8',
'l': '9',
'a': '0'
}

intab="wkv1ju2it3hs4g5rq6fp7eo8dn9cm0bla"
outtab="abcdefghijklmnopqrstuvw1234567890"
trantab = maketrans(intab, outtab)

char_table = {ord(key): ord(value) for key, value in char_table.items()}
def deCode(url):
for key, value in str_table.items():
url = url.replace(key, value)
d=url.translate(trantab)
return d

def getMoreURL(word):
word = urllib.quote(word)
url = r"http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&fp=result&queryWord={word}" \
r"&cl=2&lm=-1&ie=utf-8&oe=utf-8&st=-1&ic=0&word={word}&face=0&istype=2nc=1&pn={pn}&rn=30"
urls = (url.format(word=word, pn=x) for x in itertools.count(start=0, step=30))
#itertools.count 0开始,步长30,迭代
return urls

def getHtml(url):
page=urllib.urlopen(url)
html=page.read()
return html

def getImg(html):
reg=r'"objURL":"(.*?)"'
imgre=re.compile(reg)
imageList=re.findall(imgre, html)
imgUrls=[]

for image in imageList:
imgUrls.append(deCode(image))

l=len(imgUrls)
print l
return imgUrls

def downLoad(urls,path):
global index
for url in urls:
print("Downloading:", url)
res = urllib2.Request(url)
# res = urllib.request(url)
try:
response = urllib2.urlopen(res ,data=None, timeout=5) #超时处理
except urllib2.URLError, e:
if hasattr(e,'code'):
error_status = e.code
print(error_status, "未下载成功:", url)
continue
elif hasattr(e,'reason'):
print( "time out", url)
continue

continue

filename = os.path.join(path, str(index) + ".jpg")
# urllib.urlretrieve(url,filename)
auto_down(url,filename)
index += 1
if index-1==10000:
break
def auto_down(url,filename):
try:
urllib.urlretrieve(url,filename)
except urllib.ContentTooShortError:
print 'Network conditions is not good.Reloading.'
auto_down(url,filename)

if __name__ == '__main__':
keyWord="XXX"
index = 1
Savepath = "./img_warship/"
urls=getMoreURL(keyWord)

for url in urls:
downLoad(getImg(getHtml(url)),Savepath)
if index-1==10000:
break
...全文
3025 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jeky_zhang2013 2018-06-19
  • 打赏
  • 举报
回复
记录爬取的url,不重复爬取
mzccvb 2018-06-14
  • 打赏
  • 举报
回复
引用 1 楼 jeky198306 的回复:
需要更详细点的日志,可以看下抓包信息有什么异常
我试了很多种方法都是出现相同类似的问题,因此有一个疑惑就是百度、谷歌这种大型网站是不是有反爬机制让我无法一次爬取超过多少量的东西?因为这样子一直不停的爬他的网站是会对他造成压力的对吧?
mzccvb 2018-06-14
  • 打赏
  • 举报
回复
引用 1 楼 jeky198306 的回复:
需要更详细点的日志,可以看下抓包信息有什么异常
不好意思不是很懂怎么查看更详细的日志……但是我不用urllib.urlretrieve()改用图片write(XX.read())的方法存储图片就出现了socket.timeout: timed out的问题……要不就是Connection reset by peer的问题……很抱歉比较小白……
jeky_zhang2013 2018-06-14
  • 打赏
  • 举报
回复
需要更详细点的日志,可以看下抓包信息有什么异常
mzccvb 2018-06-14
  • 打赏
  • 举报
回复
引用 5 楼 wangyaninglm 的回复:
引用 3 楼 jhgfkdj 的回复:
[quote=引用 1 楼 jeky198306 的回复:] 需要更详细点的日志,可以看下抓包信息有什么异常
我试了很多种方法都是出现相同类似的问题,因此有一个疑惑就是百度、谷歌这种大型网站是不是有反爬机制让我无法一次爬取超过多少量的东西?因为这样子一直不停的爬他的网站是会对他造成压力的对吧?
反爬虫机制肯定应该是有的啊[/quote]那一般是怎样绕过反爬机制的呢?还有就是似乎百度图片只有最多99页,一页20张,输入一次关键字顶多爬到将近2000张图片……不知道谷歌是不是也是这样……
mzccvb 2018-06-14
  • 打赏
  • 举报
回复
引用 4 楼 jeky198306 的回复:
有的网站是做了这样处理的,你可以试个小网站
小网站没问题,就连百度贴吧的某个帖子中的图片爬下来也没问题。不过我参考另外的代码使用user_agent和headers的方法爬百度图片没问题了,只是似乎有丢失的问题,那如果我下一次重新爬取如果不想再爬同样的内容是不是只能记录之前爬取的图片的原名?然后第二次爬的时候跳过就行了
qq_37096275 2018-06-14
  • 打赏
  • 举报
回复
python
shiter 2018-06-14
  • 打赏
  • 举报
回复
引用 3 楼 jhgfkdj 的回复:
引用 1 楼 jeky198306 的回复:
需要更详细点的日志,可以看下抓包信息有什么异常
我试了很多种方法都是出现相同类似的问题,因此有一个疑惑就是百度、谷歌这种大型网站是不是有反爬机制让我无法一次爬取超过多少量的东西?因为这样子一直不停的爬他的网站是会对他造成压力的对吧?
反爬虫机制肯定应该是有的啊
jeky_zhang2013 2018-06-14
  • 打赏
  • 举报
回复
有的网站是做了这样处理的,你可以试个小网站

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧