现在我们要爬取百度贴吧的图片,选择了一个小清新一点的黄吧——P站吧。以这个贴吧为例,大家可以一次为例爬取更多的小黄网啦!
工具:pycharm,requests库,正则表达式,Python相关知识
直接po代码,注释很全乎的
import requests,re
for page in range(1,3):
#这个for循环是我们爬取的页数,从第一页开始到第二页结束(不敢爬太多怕封ip)
url = "https://tieba.baidu.com/f?kw=p%E7%AB%99&ie=utf-8&pn={}".format(page) #p站每页的url
header={
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}
#主页cookie
response = requests.get(url=url,headers=header).content.decode("utf-8")
#这第一页的HTML
tiezi = re.compile(r'<li class=" j_thread_list clearfix".*?>(.*?)</li>',re.S)
tiezi_all = tiezi.findall(response)
#通过正则表达式得到每个帖子列表的连接,事实证明这一步完全没必要,直接他妈的爬帖子链接不就完了吗
lianjie = re.compile(r'<a rel=".*?" href="/p/(.*?)".*?>.*?</a>')
lianjie_list = lianjie.findall(str(tiezi_all))
#从每个帖子的列表中找到每个帖子的链接
for j in lianjie_list: #遍历每一个帖子的链接
req=requests.get(url='https://tieba.baidu.com/p/'+j,headers=header).content.decode("utf-8")
#req是每个帖子的html内容
pic=re.compile(r'<img class="BDE_Image" src="(.*?)".*?>')
pic_list = pic.findall(req)
# 得到全部照片的链接:这个链接是多个列表,每一个小列表都是那个帖子下的素有图片的集合
if pic_list: #判断该帖子有没有图片,此时帖子有图片时
for k in pic_list: #k是当前帖子的那个图片表
img=requests.get(url=k,headers=header).content
#这个地方很关键,虽然我们得到了每个图片的链接,但是仍然需要从网页上爬取他的原始链接,这样可以保证是字节流
# img是每一个图片,这个地方因为图片关系,需要限定图片为字节流:content
with open('img/{}'.format(k[-10:]),'wb')as tf:
#保存图片的地方,k[-10:]是只保存这个图片的后10位,因为图片的字节表示的前面是https:// 存在/ 系统会错误以为是路径,所以把/去掉,只取后10位
tf.write(img)
最后咱得到的结果很丰硕!
以上