python妹子图爬虫5千张高清大图突破防盗链

2019-10-11 05:43 来源:未知

Python学习群:556370268,有大拿答疑,有能源分享!是二个相当不易的交换集散地!应接喜欢Python的同伙!

参谋资料:

上边是队列的代码:

图片 1image

  1. 论贰头爬虫的自己修养 http://blog.fishc.com/category/python/spider
  2. Requests: 让 HTTP 服务人类 http://docs.python-requests.org/zh_CN/latest/

 

下边是职能以至效用显示

1. 先写出主函数的代码
import requests
import os
import re

def download_mm(folder='mmImages', pages=10):
      """
     下载十个页面的图片,并将其保存进folder目录
      """

      #创建保存图片的文件夹
      os.mkdir('folder')
      os.chdir('folder')
      #下载图片页面初始地址
      url = 'http://jandan.net/ooxx/'
      #图片页面地址全名为http://jandan.net/ooxx/page-2364#comments,可看出图片地址为'url' '页面数'  '#comments',先定义一个函数get_page(url)来获取page_num
      page_num = int(get_page(url))

      #有了图片所在页面的全名地址就可以爬取图片的源地址了,这里我们仅下载十个页面的图片
      for i in range(pages):
        page_num -= i
        #获得十个网页的图片地址,进入页面时我们处于最新页面,因此最终得到的是此页以及前九页的地址
        page_url = url 'page-' str(page_num) '#comments'
        #获得多个图片网址后还需获得每一个图片的源地址才能下载到每一张图片,此处定义一个函数find_images来获取每张图片源地址
        img_addrs = find_images(page_url)
        #从每张图片源地址下载图片到folder文件夹
        save_imgs(folder, img_addrs)     

image

代码思路/程序流程:

Requests库使用方法与urrlib用法较为周边,但进一步轻便,上面接纳requests来进展图纸的抓取.

 

定制供给头

3.总结

(1)在此个爬虫程序中大家想要爬取四个页面内容,因而需求寻找那一个页面地址的关联,否则只好二个个输入地方来爬取,因而一初始大家须要先爬取第一个页面前境遇其html内容开展深入分析,寻找page_num.
(2)搜索规律后使用三个回顾的循环便能够爬取三个页面.
(3)对于每四个蕴涵四个图片的页面,需求分析爬取每一张图纸的地方技巧张开下载
(4)爬取到图片源地址后便足以张开下载(爬取网页并以二进制格局保存)
(5)编写代码的进度中应竭尽使得每贰个函数仅推行二个效果与利益,如此既有扶持调用出错开上下班时间也是有益调试查找bug.

pip install datetime

自己通过观望发掘meizitu网址的布满结构即便找不到切入口可是其布局每二个页面都会来得一个main-image主图,而且页面上面都会有 推荐 这几个板块,所以就i昂到了选拔从 一个页面充任入口,利用beautifulsoup恐怕pyquery剖析HTML页面提抽出推荐的任何页面,增多到循环访问队列,全体程序最外蹭利用while循环调整结构,循环不另行地遍历队列之中的url页面,各种页面都只保留多个作为显示的主图这样就循环下去程序不唯有息地运营也得以停放服务器上边爬取,顺便上传到网盘分享给科学普及--你懂的

4. 利用requests实现Python爬虫入门 (一)中以urllib编写的 交互式有道翻译乞请:
import requests
import json

url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.google.com.hk/'

data = dict()
data = dict()
data['type'] = 'AUTO'
data['i'] = input("Plz input what you want to translate: ")
data['doctype'] = 'json'
data['xmlVersion'] = '1.8'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['action'] = 'FY_BY_CLICKBUTTON'
data['typoResult'] = 'true'

r = requests.post(url, data=data)
trans_response = r.json()['translateResult'][0][0]['tgt']
print('翻译结果: ', trans_response)

下边正是多进度 二十多线程的下载代码了:

图片 2

2. 编制在主函数中供给选拔的遵从函数的代码

(1)先在url = 'http://jandan.net/ooxx/' 页面爬出新型页面数(即page_num)

def get_page(url):
    """
    返回单前网页page数,也即url = 'http://jandan.net/ooxx/'的page数
    """
    #爬取html页面内容
    html= url_open(url).text
    #找出含有本页网址的那一段字符串
    page=re.search(r'>[[0-9]{4}]<',html).group()
    #从这一段字符串提取出页面数
    page_number=re.search(r'[0-9]{4}',page).group()

    return page_number

(2)主函数中央银行使for循环拼接出十二个页面包车型的士url,然后使用find_images函数寻找每一个页面包车型大巴的每一张图纸的源地址

def find_images(url):
    """
    找到图片的源地址
    """
    #爬取当前html页面内容
    html=url_open(url).text
    #找出包含图片源地址的这一段字符串
    img_src0=re.findall(r'<imgssrc=.{,80}.[jpg|png|gif]',html)
    #从包含图片源地址的这一段字符串中提取图片的源地址
    img_src1=[img_src[10:] for img_src in img_src0]

    return img_src1

(3)寻觅图片源地址后使用再去下载图片

def save_imgs(folder, img_addrs):
    """
    保存图片
    """
    for img_addr in img_addrs:
        #将图片地址的倒数第二个字符串作为图片名
        filename=img_addr.split('/')[-1]
        #以二进制的方式(content而非text)保存图片源地址内容
        img=url_open('http:{}'.format(img_addr)).content
        with open(filename,'wb') as f:
            f.write(img)

(4)由于展开网页这一步被每每使用,由此可编写制定三个函数直接调用就可以

def url_open(url):
    """
    爬取网页
    """
    headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
    req = requests.get(url,headers=headers)
    return req 

image

爬取效果展现-不赏之功

 

代码体现

image

图片 3image

图片 4

python源代码如下

image

#!/usr/bin/env python# -*- encoding: utf-8 -*-import requestsfrom bs4 import BeautifulSoup# 定制请求头headers = {'Referer':'https://www.mzitu.com','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3679.0 Safari/537.36'}path = 'R:/python123全国等考/meizitu/'meizi_url = []meizitu_img = []start_url = 'https://www.mzitu.com/177007'meizi_url.append(start_url)r = requests.get(start_url)soup = BeautifulSoupmain_img = soup.find('div', 'main-image').img.getmeizitu_img.appendguess_like = soup.find('dl', 'widgets_like').find_allfor a in guess_like: meizi_url.append(a.get# 删除起始引导url# del meizi_url[0]# print(meizi_url)# print(meizitu_img)with open("R:/python123全国等考/meizitu/meizi-main-jpg.txt", "w") as fo: x = 1 y = 1 for node_url in meizi_url: r = requests.get soup = BeautifulSoup main_img = soup.find('div', 'main-image').img.get # 添加到文件日志并下载主图 if main_img not in meizitu_img: x  = 1 meizitu_img.append # 写入日志 fo.write(main_img 'n') # 下载主图 res = requests.get(main_img, headers=headers) if res.status_code == 200: with open(path str '-' str '.jpg', 'wb') as f: f.write(res.content) print # 猜你喜欢,跳转其他页面 guess_like = soup.find('dl', 'widgets_like').find_all for a in guess_like: like = a.get # 添加推荐页面 if like not in meizi_url: y  = 1 meizi_url.append

实在呢!还应该有一种加快的措施叫做“异步”!不过那玩意儿小编没怎么整精晓就不出来误人子弟了!(因为爬虫大部分小时都以在等候response中!‘异步’则能让程序在伺机response的小时去做的另外事情。)

爬取效果体现-结实累累

Hello 我们好!笔者又来了。

图片 5image

 

完全呈现

image

图片 6

图片 7

 

图片 8

图片 9

图片 10

image

 

好了,队列大家搞好了,下边是收获具备页面包车型客车代码:

除此以外,各位小哥儿能够参见上边代码,单独管理图片地址试试(就是三个进程一贯下载图片)?

 

图片 11

 

本来还想下载图片那一块增多异步(终归下载图片是I\O等待最久的小时了,),可惜异步作者也没怎么整了解,就不拿出去贻笑大方了。

图片 12

图片 13

率先我们须要三个模块:datetime(那么些模块比内置time模块要好使一些)不会装??不是啊!

图片 14

你是否开采下载图片速度比非常的慢、难以忍受啊!对于这种难题平时解决办法正是多进度了!多个进程速度慢!我就用十二个经过,也就是11个人齐声干。速度就可以快比比较多呀!(为啥不说二十三十二线程?懂点Python的小同伴都知晓、GIL的存在 导致Python的三十二线程有一些坑啊!)今日就教大家来做二个多进度的爬虫(其实呢、能够用来做二个超简化版的布满式爬虫)

image

image

图片 15

 

 

图片 16

image

 

好啊!多少个多进度多线的爬虫就到位了,(其实你能够安装一下MongoDB,然后调解一下一连配置,在多台机械上跑啊!!嗯,就是拔尖简化版的分布式爬虫了,纵然分外简陋。)

 

image

PS:使用二十多线程时就像在目录切换的标题上存在难题,能够给线程加个锁试试

image

学过Python基础的同班都明白、在多进程中,进程之间是不能够互相通信的,那就有三个很坑爹的主题素材的现身了!多少个进度怎么知道这那二个急需爬取、哪些已经被爬取了!

版权声明:本文由彩民之家高手论坛发布于编程技术,转载请注明出处:python妹子图爬虫5千张高清大图突破防盗链