这个是我博客的第一个小工具啊哈哈哈,觉得还是有点用处的,针对贴吧的图片实现全部下载。
这里涉及三个函数:
第一,针对一个帖子来抓所有图片:
def collect_in_page(url,path='',name='picture',start=1):
#伪造的请求头
header={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}
try:
r = requests.get(url, headers=header,timeout=3)
except:
print('open web page <',url," > timeout! i will quit.")
return start
count=start#图片的计数器
for img in BeautifulSoup(r.text).find_all('img',class_='BDE_Image'):#抓取当前页面的jpg格式图片
try:
link=img.get('src')
urlretrieve(link,path+"{}_{}.jpg".format(name,count))
print(link," downloaded.")
except:
print('picture <',img,'> error during download.')
else:
count+=1
for a in BeautifulSoup(r.text).find_all('a'):#翻页,采用递归的策略
if a.get_text()=='下一页':
newurl=urljoin(url,str(a.get('href')))
print('goto :',newurl)
return collect_in_page(newurl,path,name,count)
elif a.get_text()=='尾页':
if urlparse(url)['-2']==str(a.get('href')):
print('end to last page :',url)
return count
print('page :',url," collect finish!")
return count
第二个,对一个吧,发送请求以及参数得到当前吧里所有帖子连接:
def enter(keyword,pgn):
params={
'ie':'utf-8',
'kw':keyword,
'pn':50*pgn,#每页是有50个连接的。
}
#kw是关键词,就是在百度贴吧搜索的那个关键词...
host='https://tieba.baidu.com/f'
url='https://tieba.baidu.com/'
r=requests.get(host,params=params)
r.encoding='utf-8'
links=[]
for a in BeautifulSoup(r.text).find_all('a',class_='j_th_tit '):
links.append(urljoin(url,str(a.get('href'))))
#其实大规模数据应该用生成器的,可是贴吧数据好像不是很多...
return links
第三个就好说了,就是上面的两个函数互相配合啦:
def auto_collect(ba_name,path='',picname='tieba',start=1,limit=100):#start是文件名其实序号,limit是最多抓取多少图片,不过这个仅仅是范围估计不是准确值
for pgn in range(0,100):#获取一个页面的连接,我这里是获取最多100个页面
try:
links=enter(ba_name,pgn)
for link in links:
start=collect_in_page(link,path,picname,start)
if start>limit:
raise EOFError('out of limit you collected.')
except:
print("end of tieba or out of limit?")
sys.exit(1)
每个链接进去一次,搜刮一次图片就走人。。。
大概用法是这样子的:
auto_collect('李毅','F://pic//','mypic',1,800)
然后就去李毅吧下载图片啦。首先F盘文件夹是要存在的。
PS:截止2018/4/28此程序依然可用。