'''
选中某个贴吧,提取当前贴吧内的所有链接,再进入单个页面,提取页面第一页的所有图片
特点: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)
2.贴吧图片大量页面爬虫
最新推荐文章于 2024-09-28 17:40:14 发布