今天抽时间爬了一下百度贴吧的图片?。。。。。 还是有收获的,菜鸟的我又学到了。
直接甩代码:
import re
import lxml
import re
from urllib.parse import urlencode
from lxml import etree
from urllib.request import urlretrieve
#这些是引入的第三方库,好像说的有点多余。
header={'User-Agent':'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
j=1510
t=2000
def geturl():
title={
'kw': '街拍', #这里可以写入自己想要输入的搜索字段
'ie': 'utf-8',
'pn':'0'
}
url='https://tieba.baidu.com/f?'+urlencode(title)
return url
#这个函数的作用是按title的内容编码形成爬取的目标网址,用到了urlencode()函数
def gethtml(url):
html=requests.get(url,headers=header).text
return html
#获取网页的源码
def search(html):
pattern='<a rel="noreferrer" href="(.*?)" title="'
pattern=re.compile(pattern)
article_urls=re.findall(pattern,html)
return article_urls
#用到了正则表达式匹配具体每篇文章的artcil_urls
def do_urls(article_urls):
for i in range(len(article_urls)):
if article_urls[i][1]=='/':
article_urls[i]='https:'+article_urls[i]
else:
article_urls[i]='https://tieba.baidu.com'+article_urls[i]
return (article_urls)
#修饰获得的具体每篇文章的链接,使其变成一个完整的网址
def try_down(try_url,t):
for url in article_urls:
try:
if requests.get(try_url, headers=header, timeout=3).status_code == 200: #这里设置timeout属性很重要
html = requests.get(try_url, headers=header, timeout=3).text #这里也要设置一下
html = etree.HTML(html)
imag_urls = html.xpath('//img[@class="BDE_Image"]/@src') #xpath()寻找确实简单一些
if len(imag_urls) != 0:
for i in imag_urls:
urlretrieve(i, r'C:\Users\镇长\Desktop\爬虫测试照片\test{0}.png'.format(t))
print('+1')
t=t+1
else:
print("[]")
else:
print('进不去')
except Exception as e:
print(e)
#对于上一个函数的文章修饰其实是有一点问题的,在于不是所有的文章网页链接都是以‘https:’开头的,也有以‘http'开头的链接
#这里的这个函数对于那写开头该是http:确写成https:的网页进行一个重新的爬取
html=gethtml(geturl())
article_urls=search(html)
article_urls=do_urls(article_urls)
#对函数的调用
#下面的其实最好也应该写成一个函数。。不想写了,作用就是对每篇文章的网页源码进行正则匹配出图片的链接并对图片进行下载
pattern = r'<img class="BDE_Image" src="(.*?)" size'
pattern = re.compile(pattern)
for url in article_urls:
try:
if requests.get(url, headers=header,timeout=3).status_code == 200: #这里get()设置timeout真的很重要,最后写。
html = requests.get(url, headers=header,timeout=3).text
html=etree.HTML(html)
imag_urls = html.xpath('//img[@class="BDE_Image"]/@src') #用了xpath()寻找图片,xpath()较正则简单。
if len(imag_urls) != 0:
for i in imag_urls:
urlretrieve(i, r'C:\Users\镇长\Desktop\爬虫测试照片\test{0}.png'.format(j)) #urlretrieve()函数进行下载
print('+1')
j=j+1
else:
print("[]")
else:
print('进不去')
except Exception as e: #异常抛出
if e=="HTTPSConnectionPool(host='tieba.baidu.com', port=443): Read timed out. (read timeout=3)":
try_url='http'+url[5:] #这个错误代表的是该是http开头的网址,写成了https,所有改一下网址重新下载
try_down(try_url,t)
1.今天写的这个小爬虫,我第一次用 try-except:这种异常的处理方法确实挺好用的,不会因一个的爬取错误影响其他正常的图片爬取,而且还可以对特定的异常进行特定的处理。是挺好的。
2.get()的timeout参数的设置也挺重要的,我一开始的时候没设置,结果就是卡在一个某一个具体文章上,就卡在那了,我想就是因为当时加载某个网页就是加载不出来的原因,所以设置一个时间,不行就撤,不影响大局。
3.展示一下我爬取的成果吧,哈哈哈哈(?)