2.贴吧图片大量页面爬虫

'''
选中某个贴吧,提取当前贴吧内的所有链接,再进入单个页面,提取页面第一页的所有图片
特点:1自动将问题设置为图片文件夹的名字相对照2用beautyfulsoup来提取网址并且下载图片
3 图片下载形式为id号+序号方便追溯4模拟登陆防止服务器拒绝(实际看不出效果)
4贴吧页数超过6自动锁定为6 5检测文件夹是否存在,如果不存在则重新创建文件夹
5
创建人: caz
更新日期:20180817
报错:
第一次测试发现报错utf8故障  改用try来溢出错误
第二次测试一次性成功,共刷到83M图片
第三次报错还是utf8问题,except后添加数组为空集,直接跳出到下一轮成功解决
20190426 修正贴吧编号问题
20231203 发现百度贴吧增加了图片旋转验证 难以破解
'''




import urllib.request
import re
import os
import time
from bs4 import BeautifulSoup
import socket
import http.client
from urllib.parse import quote
x=0
url_re=re.compile(r'src="(http://imgsrc.baidu.com.+?.jpg)"')
pattern1=re.compile('\?pn=([0-9]{1,})\">尾页</a>')
pattern2=re.compile(r'href="/p/(.+)" title=".+?" target="_blank" class="j_th_tit "')

wenti='李毅'
s_utf=quote(wenti.encode("gbk") )
main=('http://tieba.baidu.com/f?kw=%s&ie=utf-8&pn=' %s_utf)
print(main)
def get_img_addrs(html):
	img_addrs=url_re.findall(html)
	img_addrs2=list(set(img_addrs))
	return img_addrs2
def download_huaban_img(url2,yeshu):
        global x
        #下载图片
        request = urllib.request.Request(url2)
        #模拟登陆,防服务器拒绝
        request.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; \
            WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36')
        try:
            html = urllib.request.urlopen(request)
        except socket.timeout:
            pass
        except urllib.request.URLError:
            pass
        except http.client.BadStatusLine:
            pass
        

        
        try:
                soup = BeautifulSoup(html,'html.parser')
                pid=soup.findAll('img',{'class':'BDE_Image'})
                #提取出要爬的网址
                for f in pid:
                        item=f.get('src')
                        print(item)
                        urllib.request.urlretrieve(item,"%s-%s.jpg" %(yeshu,x))
                        x+=1
                        
                        
        except:
                pass
            
def tieip(main,ye,pattern1):
        #解析单个贴吧的网址,页数,当页数大于6时候只爬6页的图片 
        group=fenxi(main,ye,pattern1)
        print(group)
        if  group==[]:
            tieshu=2
        elif int(group[0])<6:
            tieshu=int(group[0])+1
        elif int(group[0])>=6:
            tieshu=6
        return tieshu  
def fenxi(main,ye,pattern):
        mainurl=main+str(ye) #解析出0-50页的主页
        request = urllib.request.Request(mainurl)
        request.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; \
            WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36')        

        try:
                yemian=urllib.request.urlopen(mainurl).read().decode('utf-8') #解析网址内容
                
                
        except:
                shuzu=[] 
                return shuzu 
        shuzu=pattern.findall(yemian) #数组为很多位数的数组
        return shuzu

#正文
foot= 'C:\\Users\\ASUS\\Desktop\\'+wenti
#路径设置在桌面并判断是否有相关文件夹
if (os.path.exists(foot)):
        pass
else:
        os.mkdir(foot)       
os.chdir(foot)

for ye in range(0,2000,50):
        #解析出单个贴的数字
        shuzu=fenxi(main,ye,pattern2)
        #main是主网址,ye每50页,pattern2是过滤器 很多位数的数组
        print(shuzu)
        for shuzi in shuzu:
                #数字为贴吧主页提取的帖子数字
                html='http://tieba.baidu.com/p/'+str(shuzi)+'?pn='
                file2=tieip(html,1,pattern1)
                #当贴数大于6则只爬6条 返回单贴的页数

                x=1
                
                for i in range(1,file2):
                        url_everypage=html+str(i)
                        print(url_everypage)
                        print('Processing page:'+str(i)+'/'+str(file2-1)+'......')
                        download_huaban_img(url_everypage,shuzi)




                      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值