HenryYang 发表于 2019-3-9 16:33

阿奔哥的福利图爬取--python代码分享


    最近半个月,我开始自学python爬虫。这是我第一个独立完成的脚本,发帖纪念一下。
    首先要向游大声明一下,此贴纯粹为学习交流、经验分享之用,本人绝无恶意爬取蚂蚁论坛,仅出于练手目的爬取阿奔发表的图片,代码里也设置了暂停时间,防止服务器请求过多无法响应。以后再不会爬取蚂蚁论坛来练手(除非游大做了反爬措施,那可能还会再练手一次,不过现在还没这水平)。

1)一开始的需求构想:提取图片地址,筛除非福利图,只保留美女图片(嘿嘿),保存到同一个文件夹里方便观看;
实际效果:无筛除功能,因为非福利图的来源是新浪图片(大概是),但有些福利图也是这个来源,故不作筛除(还是贪心啊,只要是福利图就不想放过);

2)实际运行结果:在爬取到936张图片(1.99GB)后,由于未知原因程序终止,报错信息:urllib.error.HTTPError: HTTP Error 404: Not Found

现在还是找不出为什么报这个错;另外新手的代码难免繁杂,若有(阿)高(奔)手(哥)看不下去,不吝指点一下怎么写得更简洁,或者怎么解决这个报错,感激不尽!

废话有点多,下面代码奉上(由于cookie含有个人登录信息,怕有高手破解,故用'***'代替):

import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
import re
import os
import time
import socket

socket.setdefaulttimeout(20)# 设置socket层的超时时间为20秒
url_t = 'http://www.mayi.sg/home.php?mod=space&uid=61184&do=thread&view=me&order=dateline&from=space&'

def handle_request(url):
   headers = {
      'Cookie': '*******************************************************************************',

      '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',
   }
   req = urllib.request.Request(url=url, headers=headers)
   content = urllib.request.urlopen(req).read()
   return content

def save(img_url,img_name):
   print('正在保存: {}'.format(img_name))
   if not os.path.exists('./images'):
      os.mkdir(os.path.abspath('./images'))
   img = handle_request(img_url)
   with open(os.path.abspath('./images/{}').format(str(img_name)), 'wb') as fp:
      fp.write(img)

def img_Spider(pa_url):
   #解析内容,生成图片url的列表及图片名列表
   content = handle_request(pa_url).decode('gbk')
   soup = BeautifulSoup(content, 'lxml')
   #定位到:div align="left"
   img_group = soup.find_all('div', align="left")
   for img_subgroup in img_group:
      img_subgroup = str(img_subgroup.find_all('font' > 'font' > 'font'))
      url_pattern = re.compile(r'.*?src="(.*?)".*?',re.S)
      try:
         img_url = url_pattern.findall(img_subgroup)
         # 返回的是一个列表,其中是4个相同的图片url地址,所以取其中任意一个元素
         imgname_pattern = re.compile(r'[^/]+(?!.*jpg|png|gif)')
         # 图片名
         img_name = imgname_pattern.findall(img_url)[-1]
         # 保存图片
         save(img_url, img_name)
      except IndexError:
         pass

def main():
   print('=====开始爬取阿奔发布的图片=====')
   #拼接所有入口的url,构建循环
   page = 1
   while page >= 0:
      data_url = {
         'page': page
      }
      data = urllib.parse.urlencode(data_url)
      main_url = url_t + data
      print('开始爬取第{}个主页: '.format(page) + main_url)
      #构建请求对象,发送请求,获取内容
      content = handle_request(main_url).decode('gbk')
      #解析页面上所有要爬取的链接,生成列表
      soup = BeautifulSoup(content, 'lxml')
      web_list = soup.select('th')
      #遍历列表,依次获取要爬取的具体页面,启动爬虫
      for url in web_list:
         pa_url = 'http://www.mayi.sg/' + url.a['href']
         img_Spider(pa_url)
         time.sleep(6)
      time.sleep(10)
      page += 1
   print('全部爬取结束!')


if __name__ == '__main__':
   main()

萧① 发表于 2019-3-9 18:33

老衲奉劝施主,这样不好

HenryYang 发表于 2019-3-9 18:54

萧① 发表于 2019-3-9 18:33 static/image/common/back.gif
老衲奉劝施主,这样不好

大师说笑了http://www.mayi.sg//mobcent//app/data/phiz/default/03.png

战神再现 发表于 2019-3-9 19:05

小伙,你营养快线准备好了吗

一滴灌 发表于 2019-3-9 19:21

图片 人工筛选 才行啊,因为要求高嘛

猪~有才 发表于 2019-3-9 19:39

好厉害的样子,小心游侠兄弟给你封号http://www.mayi.sg//mobcent//app/data/phiz/default/01.png

一棍劈头 发表于 2019-3-9 19:51

这么厉害的嘛

HenryYang 发表于 2019-3-9 19:59

一棍劈头 发表于 2019-3-9 19:51 static/image/common/back.gif
这么厉害的嘛

刚入门而已

HenryYang 发表于 2019-3-9 20:00

战神再现 发表于 2019-3-9 19:05 static/image/common/back.gif
小伙,你营养快线准备好了吗

只存图 不伤身http://www.mayi.sg//mobcent//app/data/phiz/default/01.png

HenryYang 发表于 2019-3-9 20:01

一滴灌 发表于 2019-3-9 19:21 static/image/common/back.gif
图片 人工筛选 才行啊,因为要求高嘛

哈哈 不筛了 全都要

HenryYang 发表于 2019-3-9 20:01

猪~有才 发表于 2019-3-9 19:39 static/image/common/back.gif
好厉害的样子,小心游侠兄弟给你封号

应该不会的。。游大很民主的吧。。

星光使者 发表于 2019-3-9 20:14

完全看不懂

HenryYang 发表于 2019-3-9 20:21

星光使者 发表于 2019-3-9 20:14 static/image/common/back.gif
完全看不懂

隔行如隔山 以前我也完全看不懂

重庆崽儿麦麦哥 发表于 2019-3-9 20:37

不懂,感觉好厉害的样子?http://www.mayi.sg//mobcent//app/data/phiz/default/04.png

HenryYang 发表于 2019-3-9 20:48

重庆崽儿麦麦哥 发表于 2019-3-9 20:37 static/image/common/back.gif
不懂,感觉好厉害的样子?

还好还好
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 阿奔哥的福利图爬取--python代码分享