爬取妹子图(requests BeautifulSoup)【分分快三计划】

作者:编程技术

 分分快三计划 1

11.跻身全部画集,并下载全数图片

def download_all_pic(self, page_links):
    for page_link in page_links:
        try:
            selector = self.get_source_page(page_link)
            album_title = selector.xpath('//div[@class="article"]/h2/text()')[0]
            sum_pic = selector.xpath('//div[@id="page"]/a[last()-1]/text()')[0]
            path = self.mk_pic_dir(album_title)
        except:
            continue
        for pic in range(1, int(sum_pic)   1):
            try:
                print u'正在下载-->'   album_title   u'-->第'   str(pic)   u'张美图...'
                pic_link = page_link   '/'   str(pic)
                src = self.get_pic_link(pic_link)
                filename = '%s.jpg' % (pic)
            except:
                continue
            else:
                try:
                    '''增加打开图片链接时的头部referer属性'''
                    req = urllib2.Request(src)
                    req.add_header('Referer', 'http://img.mmjpg.com/')
                    '''写入文件'''
                    with open(path   '/'   filename, 'wb') as fp:
                        fp.write(urllib2.urlopen(src, timeout=3).read())
                 except:
                    continue

  文件夹名称即为图册名称,内部图片以页数作为文件名。

10.创制文件夹并用画册名实行命名

def mk_pic_dir(self, dirname):
    path = dirname
    if not os.path.exists(path):
        os.mkdir(path)
    return path

  刚刚入门爬虫,几眼下先对于单个画集举行爬取,过几天再拓宽翻页爬取。

12.大功告成,运维代码

分分快三计划 2

编辑器推行进度

分分快三计划 3

以图集名命名的文书夹

分分快三计划 4

对应图册里面包车型地铁持有图片

本实验的完全代码在Github上,欢迎fork

率先网址的剖析,该网址有肯定的反爬虫战略,所以回复正是投入headers(最近是小白,近些日子不知底具体为毛那样做)

6.获得总页数

def get_sum_page(self, url):
    selector = self.get_source_page(url)
    '''使用xpath提取网页中总页数的元素'''
    sum_page = selector.xpath('//div[@class="page"]//a[last()]/@href')[0].split('/')[-1]
    return sum_page

 

7.用总页数来构成拼接出具备页面包车型地铁url,并再次来到富含全数url的list

def get_all_page_urls(self, sumpage):
    urls = []
    baseurl = 'http://www.mmjpg.com/home/'
    ul = baseurl.split('/')
    for page in range(1, int(sumpage)   1):
        ul[-1] = str(page)
        url = '/'.join(ul)
        urls.append(url)
    return urls
def get_page_name(url):#获得图集最大页数和名称
    html = get_html(url)
    soup = BeautifulSoup(html, 'lxml')
    span = soup.findAll('span')
    title = soup.find('h2', class_="main-title")
    return span[10].text, title.text

5.获得网页源代码

def get_source_page(self, url):
    '''
    返回经过lxml.html.fromstring 模块处理的<Element html at 0x36e8278>
    可以用 XPath 来过滤数据
    '''
    try:
        response = urllib2.urlopen(url, timeout=3).read()
        selector = html.fromstring(response)
    except:
        selector = None
    finally:
        return selector

得到图片url链接

4.引进所供给的库

import os
import re
import urllib2                                                                                                          
from lxml import html     
start_url = "http://www.mzitu.com/"
    for count in range(1, 3):
        url = start_url   "page/"   str(count)  "/"
        save_one_page(url)

2.深入分析网页UOdysseyL变化

因而展开区别页数的页面内容后意识
第二页:http://www.mmjpg.com/home/2
第三页:http://www.mmjpg.com/home/3
每当大家点击叁个页面,url改变的是最终边的数字,因而大家要求找到总页数的html代码,才具对其开展爬虫翻页

本身爬了3个多G的图样花了本人临近4个小时,足以注解功效是真的低。

要求:近年来对python爬虫感兴趣,于是学习了下python爬虫并找了个网址演习,练习网站:http://www.mmjpg.com,个中每生龙活虎套图都以一张二个页面,存意气风发套图固然是手动得点翻几10个页面,但只要采用爬虫的话,就很有利了,轻轻巧松就能够把常娥存到硬盘了。

并且在爬取进程中现身叁个主题材料,提醒 你的主机中的软件中止了多少个已创造的连续几日,这一个难点还未有找到消除措施,也未找明发生的实际原因。

3.深入分析网页源代码

透过核算网页成分定位到了总页数的html成分:<a href="/home/79" class="last">最旧</a> 由此能够得出该网站的总页数为79页,接下去便可对其开展领取

View Code

9.获取图片的src属性

def get_pic_link(self, url):
    try:
        selector = self.get_source_page(url)
        src = selector.xpath('//div[@id="content"]/a/img/@src')[0]
    except:
        src = None
    finally:
        return src

  在main方法中先央浼到图册的称号和最大页数,并且接收名称成立一个文书夹来囤积图片。再从1到最大页数做一个for循环,

实验情状:

  • Windows 10,Python 2.7.6,Pycharm

用requests库的get方法,加上Hostreferer

1.明显目的网站

分分快三计划 5

www.mmjpg.com

解析页面url,开掘每风流浪漫页均是起头网站 page/ 页数/

8.获取每一种图册的链接

'''由于首页图片点击进去之后还有图片,因此首页图片是一个图集链接,所以得先获取图集链接,进而获取里面的所有图片,分析网页代码得知,可对其连接进行提取,并同样返回一个list'''
def get_page_links(self, urls):
    page_links = []
    for url in urls:
        try:
            selector = self.get_source_page(url)
            lis = selector.xpath('//div[@class="pic"]//li/a/@href')
        except:
            continue
        for li in lis:
            page_links.append(li)
    return page_links

剖析贰个页面中的url链接,发掘只要找 target="_blank" 那意气风发质量,则会生出不菲结余的链接,所以本身直接从字标签入手找到属性 class="lazy"的img标签,然后再在物色到img标签的父标签中的href

第生龙活虎页是从头网站,不过页数为1的链接也是一贯步向第风姿浪漫页,所以全部页的url就可以用上述通式改换页数实行遍历。

于是要求将日前的代码实行改正,插足二个rename方法,将那一个字符换来可行的字符。(在那处自个儿就一向将这一个字符去掉)

翻页爬取

import re
def rename(name):
    rstr = r'[/\:*?<>|]'
    new_name = re.sub(rstr, "", name)
    return new_name

def save_one_atlas(old_url):
    page, name = get_page_name(old_url)
    new_name = rename(name)
    os.mkdir(new_name)

    print("图集--"   name   "--开始保存")
    for i in range(1, int(page) 1):
        url = old_url   "/"   str(i)
        img_url = get_img_url(url, name)
        # print(img_url)
        save_img(img_url, i, name)
        print('正在保存第'   str(i)   '张图片')
    print("图集--"   name   "保存成功")

 

 

而最大页数只是被span标签富含,不恐怕透过品质来提取。所以提取图册名称接收标签字 属性名一起提取,而最大页数就接受将span标签全体搜索,最大页数在span标签中第11人,

 

此处充任测验,所以只爬取前两页图集。改动range内的参数,就可以匡正爬取页数。

 

 1 import requests
 2 from bs4 import BeautifulSoup
 3 import os
 4 import re
 5 
 6 Hostreferer = {
 7     'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
 8     'Referer':'http://www.mzitu.com'
 9 }
10 Picreferer = {
11     'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
12     'Referer':'http://i.meizitu.net'
13 }
14 
15 def get_page_name(url):#获得图集最大页数和名称
16     html = get_html(url)
17     soup = BeautifulSoup(html, 'lxml')
18     span = soup.findAll('span')
19     title = soup.find('h2', class_="main-title")
20     return span[10].text, title.text
21 
22 def get_html(url):#获得页面html代码
23     req = requests.get(url, headers=Hostreferer)
24     html = req.text
25     return html
26 
27 def get_img_url(url, name):
28     html = get_html(url)
29     soup = BeautifulSoup(html, 'lxml')
30     img_url = soup.find('img', alt= name)
31     return img_url['src']
32 
33 def save_img(img_url, count, name):
34     req = requests.get(img_url, headers=Picreferer)
35     new_name = rename(name)
36     with open(new_name '/' str(count) '.jpg', 'wb') as f:
37         f.write(req.content)
38 
39 def rename(name):
40     rstr = r'[/\:*?<>|]'
41     new_name = re.sub(rstr, "", name)
42     return new_name
43 
44 def save_one_atlas(old_url):
45     page, name = get_page_name(old_url)
46     new_name = rename(name)
47     os.mkdir(new_name)
48     
49     print("图集--"   name   "--开始保存")
50     for i in range(1, int(page) 1):
51         url = old_url   "/"   str(i)
52         img_url = get_img_url(url, name)
53         # print(img_url)
54         save_img(img_url, i, name)
55         print('正在保存第'   str(i)   '张图片')
56     print("图集--"   name   "保存成功")
57 
58 
59 def get_atlas_list(url):
60     req = requests.get(url, headers=Hostreferer)
61     soup = BeautifulSoup(req.text, 'lxml')
62     atlas = soup.find_all(attrs={'class':'lazy'})
63     atlas_list = []
64     for atla in atlas:
65         atlas_list.append(atla.parent['href'])
66     return atlas_list
67 
68 def save_one_page(start_url):
69     atlas_url = get_atlas_list(start_url)
70     for url in atlas_url:
71         save_one_atlas(url)
72 
73 
74 if __name__ == '__main__':
75     start_url = "http://www.mzitu.com/"
76     for count in range(1, 3):
77         url = start_url   "page/"   str(count)  "/"
78         save_one_page(url)
79     print("爬取完成")

 

爬取一整页图册

明天是对于单个图集的爬取,就分选三个进展爬取,作者选择的链接为:

  使用requests库和BeautifulSoup库

然后图片的每风流罗曼蒂克页是     图集首页  / 现阶段页数,获得含有图片内容的url链接,前面就能够将赢得图片存入本地。

总体代码

 

该办法传入的参数有3个,第三个是图片url,第贰个当前图片的页数,用作创设文件,第多少个是图册名称,在积存早前先创立了三个名称是画册名称的文书夹,那样就能够将图纸存入内定文件夹

 

 

 

 

 

def save_img(img_url, count, name):
    req = requests.get(img_url, headers=Picreferer)
    with open(name '/' str(count) '.jpg', 'wb') as f:
        f.write(req.content)

分分快三计划 6

  深入分析页面内容,含有图片链接的img标签中有三个alt属性的值是跟图集名称相近,能够用这么些来平昔找到这么些标签,当然也得以先找到div标签中的class属性是main-inage,再找到img的src属性,这里笔者就采用第黄金年代种方式。

import requests
from bs4 import BeautifulSoup
import os

Hostreferer = {
    'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
    'Referer':'http://www.mzitu.com'
}
Picreferer = {
    'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
    'Referer':'http://i.meizitu.net'
}

def get_page_name(url):#获得图集最大页数和名称
    html = get_html(url)
    soup = BeautifulSoup(html, 'lxml')
    span = soup.findAll('span')
    title = soup.find('h2', class_="main-title")
    return span[10].text, title.text

def get_html(url):#获得页面html代码
    req = requests.get(url, headers=Hostreferer)
    html = req.text
    return html

def get_img_url(url, name):
    html = get_html(url)
    soup = BeautifulSoup(html, 'lxml')
    img_url = soup.find('img', alt= name)
    return img_url['src']

def save_img(img_url, count, name):
    req = requests.get(img_url, headers=Picreferer)
    with open(name '/' str(count) '.jpg', 'wb') as f:
        f.write(req.content)

def main():
    old_url = "http://www.mzitu.com/123114"
    page, name = get_page_name(old_url)
    os.mkdir(name)
    for i in range(1, int(page) 1):
        url = old_url   "/"   str(i)
        img_url = get_img_url(url, name)
        #print(img_url)
        save_img(img_url, i, name)
        print('保存第'   str(i)   '张图片成功')
main()
def get_img_url(url, name):
    html = get_html(url)
    soup = BeautifulSoup(html, 'lxml')
    img_url = soup.find('img', alt= name)
    return img_url['src']

深入分析网页构成如图所示,图册名称包括在h2标签内,且该标签在整整HTML代码里有唯风度翩翩的class="main-title",

  赢得图片url链接之后要讲图片存到本地,在号召图片url的时候要投入Picreferer,不然网址会感到你是三个爬虫,会返还给你八个盗链图

前贰个头作为央求网址,后四个头作为破解盗链使用

 

 

Hostreferer = {
    'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
    'Referer':'http://www.mzitu.com'
}
Picreferer = {
    'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
    'Referer':'http://i.meizitu.net'
}
def get_html(url):#获得页面html代码
    req = requests.get(url, headers=Hostreferer)
    html = req.text
    return html

 

分分快三计划 7

 

上边计划上马多个页面包车型地铁爬取,先将前方爬取叁个图册的诀窍进行打包

将图纸存入本地

爬取三个图集

获得图册名称以致图册最大页数

def save_one_page(start_url):
    atlas_url = get_atlas_list(start_url)
    for url in atlas_url:
        save_one_atlas(url)
def get_atlas_list(url):
    req = requests.get(url, headers=Hostreferer)
    soup = BeautifulSoup(req.text, 'lxml')
    atlas = soup.find_all(attrs={'class':'lazy'})
    atlas_list = []
    for atla in atlas:
        atlas_list.append(atla.parent['href'])
    return atlas_list

将爬取一整夜画册进行打包,方便后续的翻页爬取

爬取一个图册完整代码

这边运用re库,将name中蕴藏的非官方字符换来空,能够看作直接去掉。

爬取结果

  目的网址:妹子图

收获页面HTML代码

在进展爬取贰个图册前先加入多个措施,在爬取图册名称的时候,由于名称的字符不限,所以恐怕出现含有文件夹中不能够冒出的部分字符,举例:/ : ? < > 等

 

这是自身写的率先篇较长的博客,还应该有为数不菲未完备的地点,希望大家见谅。

其风姿罗曼蒂克顺序可以爬取图片,但是成效太低,正在上学多进度,希望今后方可加强该程序的爬取功能。

分分快三计划 8分分快三计划 9

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划 日记本