• 爬虫实战3:使用request,bs4爬动态加载图片


    参考网站:https://blog.csdn.net/Young_Child/article/details/78571422

    在爬的过程中遇到的问题:

    1、被ban:更改header的User-Agent,伪装成浏览器浏览,如果还被ban可以使用代理,这个网站只需要伪装头再加上time.sleep()就可以解决了(我导入了fake_useragent,也可以自己造个轮子,我比较懒,直接用了别人的轮子)

    2、下载下来的图片是同一张,全是防盗链图片这个问题我也找了好久,结果发现只要在头里加上’Referer’就可以了

    HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。——百度百科

    3. 此代码需要在在linux的python2下运行,在windows下会出现异常。

     

    完整代码如下

      1 #!/usr/bin/evn python
      2 # -*- coding:utf-8 -*-
      3 # __author__:
      4 #import urllib2
      5 import bs4
      6 import time
      7 import requests
      8 import fake_useragent
      9 import os
     10 import re
     11 import sys
     12 #import xlrd
     13 import random
     14 
     15 # 用于将u 转换成 string
     16 reload(sys)
     17 sys.setdefaultencoding('utf-8')  # u -> str
     18 
     19 
     20 class GetPictures(object):
     21     def __init__(self):
     22         self.url = 'http://www.mmjpg.com/mm/1'
     23         self.first_num = 0
     24         self.sum_num = 0
     25         self.pictures_sum()
     26         self.urls = self.get_urls()
     27         for url in self.urls:
     28             self.down_pictures(self.get_img_urls(url))
     29 
     30     # 输入需要的套数
     31     def pictures_sum(self):
     32         str1 = raw_input(r"第几套开始,重复会跳过")
     33         try:
     34             self.first_num = int(float(str1))
     35         except ValueError:
     36             print ('输入的不为数字')
     37 
     38         str1 = raw_input("收集多少套")
     39         try:
     40             self.sum_num = int(float(str1))
     41         except ValueError:
     42             print("输入的不为数字")
     43             exit(1)
     44 
     45     # 得到所有套图的第一张所在网页的URL
     46     def get_urls(self):
     47         urls = []
     48         for i in xrange(self.first_num, self.first_num+self.sum_num):
     49             url_split = self.url.split('/')
     50             url_split[-1] = str(i)
     51             urls.append('/'.join(url_split))
     52         # print urls
     53         return urls
     54 
     55     # 得到一共有多少张图
     56     def get_img_sum_num(self, img_url):
     57         fa = fake_useragent.UserAgent()
     58         headers = {'User-Agent': fa.random,
     59                    'Referer': 'http://www.mmjpg.com'}
     60         request = requests.get(img_url, headers=headers)
     61         soup = bs4.BeautifulSoup(request.content, 'lxml')
     62         # 获取标签里面的值
     63         img_sum_number = soup.find_all('a', href=re.compile('/mm'))[8].get_text().strip()
     64         print img_sum_number
     65         img_sum_number = int(img_sum_number)
     66         # print img_sum_number
     67         return img_sum_number
     68 
     69     # 得到该套图中的所有图片的URL
     70     def get_img_urls(self, url):
     71         fa = fake_useragent.UserAgent()
     72         headers = {'User-Agent': fa.random,
     73                    'Referer': 'http://m.mmjpg.com'}
     74         request = requests.get(url, headers=headers)
     75         soup = bs4.BeautifulSoup(request.content, 'lxml')
     76         first_img_url = soup.find('img').get('src')     # 获取标签值
     77         url_split = first_img_url.split('/')
     78         img_urls = []
     79         for i in xrange(1, self.get_img_sum_num(url)+1):
     80             url_split[-1] = (str(i)+'.jpg')
     81             img_urls.append('/'.join(url_split))
     82         # print img_urls
     83         return img_urls
     84 
     85     # 下载图片
     86     def down_pictures(self, img_urls):
     87         img_name = str(img_urls[0].split('/')[-2])+'-'+str(img_urls[0].split('/')[-3])
     88         if os.path.exists(img_name):    # 查重 如果这个文件夹存在则跳过 防止重复下载
     89             time.sleep(1)
     90             print img_name+'存在'
     91             return
     92         os.mkdir(img_name)
     93         for img_url in img_urls:
     94             fa = fake_useragent.UserAgent()
     95             headers = {'User-Agent': fa.random,
     96                        'Referer': 'http://m.mmjpg.com'}
     97             request = requests.get(img_url, headers=headers)
     98 
     99             with open(img_name + u'/' + img_url.split('/')[-1], 'wb') as f:
    100                 f.write(request.content)    # contents返回的为二进制   text返回的为union类型
    101                 f.close()
    102                 print "已保存" + img_name + '/' + img_url.split('/')[-1]
    103                 time.sleep(random.random()*2)
    104 
    105 
    106 # 运行程序
    107 if __name__ == '__main__':
    108     GetPictures()
    109 
    110 '''
    111 用requests,bs4 抓取mmjpg.com上的套图
    112 将上面的套图按套进行保存
    113 '''
  • 相关阅读:
    Go复习--为何不允许重载overload?
    Go疑问-1
    Go复习--for循环陷井
    Go复习--slice协程不安全
    Go复习之久违的goto语句
    Go复习---编译错误:undefined:
    Linux 环境拷贝文件发生的错误
    【转载】java数据库操作
    VBA文件处理
    【转】关于C#使用Excel的数据透视表的例子
  • 原文地址:https://www.cnblogs.com/regit/p/9273277.html
Copyright © 2020-2023  润新知