澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

Python爬虫之爬取美女图片,Python漫画爬虫两弹

  刚刚入门爬虫,明天先对于单个图集进行爬取,过几天再拓展翻页爬取。

爬取妹子图(requests BeautifulSoup),

---恢复生机内容开头---

  刚刚入门爬虫,今日先对于单个图集进行爬取,过几天再进行翻页爬取。

  使用requests库和BeautifulSoup库

  指标网址:妹子图

前天是对此单个图集的爬取,就选取一个开始展览爬取,小编采取的链接为:

第一网址的深入分析,该网址有自然的反爬虫计谋,所以回复就是进入headers(方今是小白,如今不知器具体为毛那样做)

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'
}

前一个头作为诉求网址,后叁个头作为破解盗链使用

获取页面HTML代码

用requests库的get方法,加上Hostreferer

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

 

获得图集名称以及图集最大页数

剖析网页构成如图所示,图集名称包涵在h2标签内,且该标签在整整HTML代码里有唯一的class="main-title",

而最大页数只是被span标签包括,不可能通过品质来提取。所以提取图集名称选用标具名 属性名一齐提取,而最大页数就使用将span标签全体搜索,最大页数在span标签中第11人,

 澳门新浦京娱乐场网站 1

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

 

获取图片url链接

  分析页面内容,含有图片链接的img标签中有一个alt属性的值是跟图集名称一致,可以用这么些来直接找到这么些标签,当然也足以先找到div标签中的class属性是main-inage,再找到img的src属性,这里自身就使用第一种办法。

澳门新浦京娱乐场网站 2

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']

 

将图纸存入本地

  取得图片url链接之后要讲图片存到本地,在呼吁图片url的时候要投入Picreferer,否则网址会感觉你是贰个爬虫,会返还给您三个盗链图

该措施传入的参数有3个,第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)

 

完全代码

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()

 

  在main方法中先须要到图集的名目和最大页数,并且应用名称成立一个文本夹来存储图片。再从1到最大页数做一个for循环,

下一场图片的每一页是     图集首页  / 眼前页数,收获含有图片内容的url链接,后边就能够将获得图片存入本地。

 

爬取结果

澳门新浦京娱乐场网站 3

 

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

 

 

 

#脚下就先进行二个图集的爬取,后边爬取四个图集笔者会尽快更新,有怎么着难题得以在江湖批评,迎接大家座谈。

BeautifulSoup), ---恢复生机内容伊始--- 刚刚入门爬虫,前几日先对于单个图集举行爬取,过几天再开始展览翻页爬取。 使用request...

须求:方今对python爬虫感兴趣,于是学习了下python爬虫并找了个网站演练,演习网站:http://www.mmjpg.com,当中每一套图都以一张多少个页面,存一套图尽管是手动得点翻几十二个页面,但一旦运用爬虫的话,就相当的低价了,轻轻巧松就足以把月宫仙子存到硬盘了。

澳门新浦京娱乐场网站 4

骨子里从接触python到现行反革命一度快大四个月了,中间看过好多的录像,也随即别人的学科写过无数事物,不过到近期还以为并未有入门。其实个中也精通是为啥,就好比小学生讲解同样,上课认真听,认真做速记,然则下了课之后就从不看笔记,也绝非写作业。上课一听就懂,本身一写吗都不会,小编深信不疑广大人跟本人今后是均等的痛感,所以未来开立那些作业集,一来是想鼓励本身真实正正的写点东西,二来也是期望广大的读者老师能够给自家批阅和修改批阅和修改作业,我们互相学习共同提高。

  使用requests库和BeautifulSoup库

试验景况:

  • Windows 10,Python 2.7.6,Pycharm

14.jpg

好了,现在上马进入正题。

  指标网址:妹子图

1.规定目的网站

澳门新浦京娱乐场网站 5

www.mmjpg.com

在后边一篇抓取漫画图片的稿子里,通超过实际现叁个粗略的Python程序,遍历全部漫画的url,对须要所重返的html源码进行正则表明式分析,来提取到要求的数据。

第一弹 邪恶集

澳门新浦京娱乐场网站 6

dd01.jpg

干什么会想到爬邪恶集啊?是因为事先看到过msq3大神写的邪恶集爬虫,所以本人也想照着她的写一写。可是碍于自个儿水平有限,msq3用了面向对象编制程序,其实小编还不太会。所以就用自个儿的措施写了。写的不得了的地方还请各位老师多教导教导。

明日是对此单个图集的爬取,就采取四人作品展开爬取,小编采纳的链接为:

2.深入分析网页USportageL变化

透过展开分化页数的页面内容后开采
第二页:http://www.mmjpg.com/home/2
第三页:http://www.mmjpg.com/home/3
每当大家点击四个页面,url更动的是最终面的数字,由此大家需求找到总页数的html代码,技艺对其实行爬虫翻页

本篇文章,通过 scrapy 框架来落实均等的成效。scrapy 是三个为了爬取网址数据,提取结构性数据而编写制定的运用框架。关于框架使用的越多详细的情况可浏览官方文书档案,本篇小说显示的是爬取漫画图片的大意达成进程。

首先步 央浼页面

澳门新浦京娱乐场网站 7

get_page函数诉求网页

get_page函数特地用来央求网页的,这里必要小心的地点是网页的编码格式不是普普通通的utf8,所以要钦点网页编码是gb2312,否则重返的网页不可能显示中文。

澳门新浦京娱乐场网站 8

Paste_Image.png

只是本身在此地依旧遇到了三个小意思。譬喻说

澳门新浦京娱乐场网站 9

Paste_Image.png

澳门新浦京娱乐场网站 10

Paste_Image.png

题目不可能展现,有未有大神知道是干什么?

首先网址的分析,该网址有必然的反爬虫战略,所以回复便是参预headers(前段时间是小白,最近不知底具体为毛那样做)

3.深入分析网页源代码

经过查处网页元素定位到了总页数的html成分:<a href="/home/79" class="last">最旧</a> 由此能够吸取该网址的总页数为79页,接下去便可对其进展提取

scrapy碰着布署

其次步 获取具备漫画的url

澳门新浦京娱乐场网站 11

Paste_Image.png

从图中大家能够看到一共有19页661部卡通,全体我们只要写个列表生成式,那样就能够把持有19页的url放进二个列表中然后逐个必要每一页的url就能够获得具备漫画的url了。极粗略吗!

澳门新浦京娱乐场网站 12

19页url

大家得以看来漫画的链接在class="piclist listcon"的列表中,不过链接是不完全的,大家务必继续拼出完整的url才行。

澳门新浦京娱乐场网站 13

Paste_Image.png

get_comic_url函数正是用来获取具备漫画的url并且将其保存到comic_list的列表中。一共663个url。

澳门新浦京娱乐场网站 14

获得具备漫画url

Beautifulsoup作者就非常少说了,驾驭爬虫的应当都清楚。这里大家用到了parse.urljoin()函数(from urllib import parse)这些函数呢是用来拼接url的(作者只了然那样多,(⊙﹏⊙)b,感到温馨好水。。。会用就好了。)

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'
}

4.引入所需求的库

import os
import re
import urllib2                                                                                                          
from lxml import html     

安装

首先是 scrapy 的设置,博主用的是Mac系统,直接运转命令行:

pip install Scrapy

对此html节点音讯的领取使用了 Beautiful Soup 库,差不离的用法可知事先的一篇文章,直接通过命令安装:

pip install beautifulsoup4

澳门新浦京娱乐场网站,对于指标网页的 Beautiful Soup 对象初阶化需求用到 html5lib 解释器,安装的授命:

pip install html5lib

安装到位后,直接在命令行运营命令:

scrapy

能够看到如下输出结果,那时候注脚scrapy安装到位了。

Scrapy 1.2.1 - no active project

Usage:
  scrapy <command> [options] [args]

Available commands:
  bench         Run quick benchmark test
  commands      
  fetch         Fetch a URL using the Scrapy downloader
  genspider     Generate new spider using pre-defined templates
  runspider     Run a self-contained spider (without creating a project)
  settings      Get settings values
  ...
其三步 分析漫画实际情况页获取漫画题目和图纸的链接

上一步呢大家获得了全部漫画的url保存在了叁个list个中,以往大家每种央浼comic_list中的url。
通过观望网页我们开掘我们能够从网页上直接看看漫画一共有多少页(page_num),也正是多少张图片。
(上一章下一章点开过后会意识跳到了别的一部卡通,全数大家不要在意,这里的一部卡通非常的短)

澳门新浦京娱乐场网站 15

Paste_Image.png

澳门新浦京娱乐场网站 16

猎取一共稍微页

澳门新浦京娱乐场网站 17

获得一共稍稍页

正则是用来提取数字。

然后大家一页一页的点击旁观url的变化会发掘除却第一页的url便是卡通的url外,别的从第二页平昔到结尾的url都是有规律的

澳门新浦京娱乐场网站 18

第一页url

澳门新浦京娱乐场网站 19

第二页url

澳门新浦京娱乐场网站 20

第三页url

澳门新浦京娱乐场网站 21

第十二页url

找到规律那就轻松了,跟在此以前组织漫画url差不离。大家协会构造除了第一页外的任何页数的url

澳门新浦京娱乐场网站 22

每一页的url

先去掉html,在加上_{}.html。
诸如此类大家就足以获取漫画的标题(用来作为文件夹的名字)和漫画每一张图纸的链接。方便之后的下载和封存。

前叁个头作为恳求网址,后二个头作为破解盗链使用

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

类型创建

通过命令行在这几天路径下创建二个名叫 Comics 的项目

scrapy startproject Comics

开创完结后,当前目录下现身对应的品类文件夹,能够看到变化的Comics文本结构为:

|____Comics
| |______init__.py
| |______pycache__
| |____items.py
| |____pipelines.py
| |____settings.py
| |____spiders
| | |______init__.py
| | |______pycache__
|____scrapy.cfg

Ps. 打字与印刷当前文件结构命令为:

find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'

各样文件对应的现实效果可查阅官方文档,本篇完成对这一个文件涉及十分的少,所以按下不表。

第四步 保存漫画

封存漫画分两步,首先是创造文件夹,其次是保留。

澳门新浦京娱乐场网站 23

创建文件夹

当中的filename就是第三步中获得的漫画标题。
保存图片大家用到了urllib库中request.urlretrieve()假定直接保存的话可能会报403的错。所以我们需求把User-agent加进去。

澳门新浦京娱乐场网站 24

保存图片

咱俩用图片链接的前边二个人(如这里是dd12)作为每一张图片的名字(title)用于区分图片

澳门新浦京娱乐场网站 25

图片链接

这样的话大家就足以把具有的漫画都爬下来啦。是或不是很简短!

澳门新浦京娱乐场网站 26

Paste_Image.png

澳门新浦京娱乐场网站 27

Paste_Image.png

澳门新浦京娱乐场网站 28

Paste_Image.png

完整的代码在自家的GitHub上,喜欢的就赏个少于。

收获页面HTML代码

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

创建Spider类

成立叁个用来促成具体爬取效用的类,大家具备的拍卖达成都会在这些类中打开,它必须为 scrapy.Spider 的子类。

Comics/spiders 文件路线下创立 comics.py 文件。

comics.py 的求实贯彻:

#coding:utf-8

import scrapy

class Comics(scrapy.Spider):

    name = "comics"

    def start_requests(self):
        urls = ['http://www.xeall.com/shenshi']
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        self.log(response.body);

自定义的类为scrapy.Spider的子类,其中的name属性为该爬虫的唯一标记,作为scrapy爬取命令的参数。其余办法的习性持续再解释。

第二弹 风之动漫全站爬虫

澳门新浦京娱乐场网站 29

女帝

风之动漫相比较邪恶集呢稍微有一点点难度,可是也是完全同样,跟着作者的步子,笔者深信不疑你能够看精晓。

用requests库的get方法,加上Hostreferer

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

运行

创立好自定义的类后,切换成Comics路子下,运转命令,运维爬虫任务开始爬取网页。

scrapy crawl comics

打字与印刷的结果为爬虫运行进度中的音讯,和对象爬取网页的html源码。

2016-11-26 22:04:35 [scrapy] INFO: Scrapy 1.2.1 started (bot: Comics)
2016-11-26 22:04:35 [scrapy] INFO: Overridden settings: {'ROBOTSTXT_OBEY': True, 'BOT_NAME': 'Comics', 'NEWSPIDER_MODULE': 'Comics.spiders', 'SPIDER_MODULES': ['Comics.spiders']}
2016-11-26 22:04:35 [scrapy] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.logstats.LogStats']
 ...

那会儿,贰个为主的爬虫创立达成了,上面是切实可行进程的达成。

第一步 先剖析网页

张开风之动漫拉到最上边大家能够看看在网址的最上边有二个网址地图

澳门新浦京娱乐场网站 30

网址地图

开发未来呢我们能够看来全站的保有漫画都在里面。

澳门新浦京娱乐场网站 31

享有漫画

那下就简单多了,爬取map页的具有漫画的url,然后放入二个list中,依次须要list中卡通的url,从而爬取全体的漫画。
此地的漫画跟邪恶集不一致的是,每一部卡通都有大多话。每一话又有繁多的图片。全体在处理的时候有个别有一点麻烦。

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

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

澳门新浦京娱乐场网站 32

卡通每一话

获得漫画每一话的标题和呼应的url,保存到字典comic_chapter_url_dict

澳门新浦京娱乐场网站 33

Paste_Image.png

澳门新浦京娱乐场网站 34

Paste_Image.png

若是不知道哪些是****kwargs的,请自行百度“什么是*args和****kwargs”,写那个爬虫此前本人也不懂,写完事后夏虫语冰。笔者的精通正是*args呢表示能够把列表当参数字传送给函数举办处理,****kwargs**表示能够把字典当做参数字传送给函数进行管理。不晓得怎么用的能够看看笔者的爬虫源码。

 

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

发端地址

爬虫的起始地址为:

http://www.xeall.com/shenshi

大家首要的关心点在于页面中间的卡通列表,列表下方有突显页数的控件。如下图所示

澳门新浦京娱乐场网站 35

1.jpg

爬虫的显要职分是爬取列表中每一部卡通的图片,爬取完当前页后,进入下一页漫画列表继续爬取漫画,依次不断循环直至全部漫画爬取落成。

胚胎地址的url大家放在了start_requests函数的urls数组中。其中start_requests是重载了父类的诀要,爬虫职分起先时会实行到这一个主意。

start_requests艺术中主要性的执行在这一行代码:要求钦点的url,哀告完毕后调用对应的回调函数self.parse

scrapy.Request(url=url, callback=self.parse)

对于在此之前的代码其实还有另一种完成模式:

#coding:utf-8

import scrapy

class Comics(scrapy.Spider):

    name = "comics"
    start_urls = ['http://www.xeall.com/shenshi']

    def parse(self, response):
        self.log(response.body);

start_urls是框架中提供的性质,为三个含有指标网页url的数组,设置了start_urls的值后,没有须要重载start_requests办法,爬虫也会挨个爬取start_urls中的地址,并在乞请实现后活动调用parse用作回调方法。

唯独为了在进度中有益调式其它的回调函数,demo中只怕利用了前一种完毕格局。

其三步 深入分析每一话,爬取全部图片

最难的局部来了。
首先经过F12 我们能够见到图片的链接在三个id="mhpic"的img标签中

澳门新浦京娱乐场网站 36

图片链接

倘若向来爬这么些标签是怎么着也爬不到的。因为图片的src是通过js加载的,直接爬是可怜。
其次咱俩该怎么创设文件夹才具把图片保存到对应的卡通对应的一话中呢?
最后咱俩该怎么翻页呢?

澳门新浦京娱乐场网站 37

翻页

风之动漫不像邪恶集直接告诉咱们总括有稍许页。风之动漫借使不翻到最后一页的话是不精晓一共某些许页的。
带着那多少个难题我们再而三往下看。
焚薮而田第二个难题我们运用selenium PhantomJS就能够了,selenium是自动化测验框架,能够依样葫芦浏览器操作,PhantomJS是贰个无界面包车型客车浏览器。小编信任大家应该都知道。如若不懂的话推荐我们看一下崔庆才先生的用selenium模拟浏览器抓取天猫商城商品山珍海味音讯自己也是看这一个才晓得的。

澳门新浦京娱乐场网站 38

获取图片链接

html = brower.page_source即使js加载之后的网页,那个时候我们用正则匹配出图片的链接就能够了。
接下去我们成立文件夹

澳门新浦京娱乐场网站 39

文件夹名

大家得以看到在“地方”之中正好有大家要的文本夹名字(旋风管家 旋风管家561话)那就差寥寥无几了。

澳门新浦京娱乐场网站 40

文本夹名

选用正则表明式相称出大家想要的字符分别保存在path1和path第22中学作为路径,然后调用make_file()函数创立文件

澳门新浦京娱乐场网站 41

make_file()

最后轮到翻页。那些也挺简单的,大家假若在爬取每一页的时等候法庭判果决一下这一页有未有字符“下一頁”,假如有就有下一页若无正是终极一页。甘休爬取。

澳门新浦京娱乐场网站 42

翻页

每一页的url也许有规律的形如index_1,index_2,index_3。。。构造一下就出去了,依次乞请依次爬取每一张图片。

澳门新浦京娱乐场网站 43

结果1

澳门新浦京娱乐场网站 44

结果2

澳门新浦京娱乐场网站 45

结果4

澳门新浦京娱乐场网站 46

结果4

听起来是还是不是挺简单的?其实达成起来照旧须求协和多动动脑筋的。我们能够依照笔者的笔触先完毕一下,不知道的地点能够参见一下自家的源码
四个爬虫即便能够兑现漫画的爬取,但是呢爬虫其实写的很粗大糙,有相当多地点能够立异。比方说,好多不行管理未有加进去在保留图片的时候时有时就能够凌驾那样的报错

澳门新浦京娱乐场网站 47

报错

网址尚未反爬,若是有反爬我们又该怎么管理呢?这么多漫画爬起来会非常慢,我们得以进入多进度和四线程。最终吧,小编感觉可以用到面向对象来写大概会更加好一些,然而碍于本身水平有限,还不太会用面向对象方法。

最后希望能够帮助这些比作者还小白的小白,也可望各位大神看过未来能够指点一二,不胜感谢。
五个爬虫的GitHub地址

收获图集名称以及图集最大页数

10.创设文件夹并用图集名举办命名

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

爬取漫画url

从开端网页初始,首先我们要爬取到每一部卡通的url。

深入分析网页构成如图所示,图集名称包涵在h2标签内,且该标签在全体HTML代码里有唯一的class="main-title",

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

当前页漫画列表

初步页为漫画列表的第一页,大家要从当前页中领抽取所需音讯,动过达成回调parse方法。

在初始导入BeautifulSoup

from bs4 import BeautifulSoup

恳请再次来到的html源码用来给BeautifulSoup初始化。

def parse(self, response):
    content = response.body;
    soup = BeautifulSoup(content, "html5lib")

伊始化钦定了html5lib解释器,若没安装这里会报错。BeautifulSoup初阶化时若不提供钦点解释器,则会自动使用自感觉卓绝的最好解释器,这里有个坑,对于指标网页的源码使用暗许最棒解释器为lxml,此时深入分析出的结果会有标题,而导致不可能举办接下去的数码提取。所以当发掘不常候提取结果又难题时,打字与印刷soup探望是或不是正确。

翻开html源码可见,页面中呈现漫画列表的一些为类名叫listconul标签,通过listcon类能唯一确认对应的竹签

澳门新浦京娱乐场网站 48

2.jpg

领取包罗漫画列表的价签

listcon_tag = soup.find('ul', class_='listcon')

上面的find方法意为寻觅classlistconul标签,再次回到的是对应标签的有所剧情。

在列表标签中搜寻全数具备href属性的a标签,这些a标签即为每部漫画对应的音信。

com_a_list = listcon_tag.find_all('a', attrs={'href': True})

下一场将每部漫画的href品质合成完整能访问的url地址,保存在三个数组中。

comics_url_list = []
base = 'http://www.xeall.com'
    for tag_a in com_a_list:
        url = base   tag_a['href']
        comics_url_list.append(url)

此时comics_url_list数组即包涵当前页每部漫画的url。

而最大页数只是被span标签包蕴,不能透过质量来领取。所以提取图集名称选用标签字 属性名一齐提取,而最大页数就选取将span标签全部搜索,最大页数在span标签中第12人,

12.大功告成,运营代码

澳门新浦京娱乐场网站 49

编辑器实践进度

澳门新浦京娱乐场网站 50

以图集名命名的公文夹

澳门新浦京娱乐场网站 51

对应图集里面包车型大巴保有图片

本实验的一体化代码在Github上,欢迎fork

下一页列表

见到列表下方的采用页控件,我们能够通过那些地点来获取到下一页的url。

澳门新浦京娱乐场网站 52

3.jpg

收获采用页标签中,全部包蕴href属性的a标签

page_tag = soup.find('ul', class_='pagelist')
page_a_list = page_tag.find_all('a', attrs={'href': True})

那某些源码如下图,可看到,全体的a标签中,倒数第一个代表末页的url,倒数首个象征下一页的url,由此,大家得以由此取page_a_list数组中尾数首个要一贯博取到下一页的url。

澳门新浦京娱乐场网站 53

5.jpg

但此间供给小心的是,若当前为最后一页时,无需再取下一页。那么怎么着决断当前页是不是是最后一页呢?

能够因而select控件来推断。通过源码能够判明,当前页对应的option标签会具备selected属性,下图为当前页为率先页

澳门新浦京娱乐场网站 54

4.jpg

下图为当前页为终极一页

澳门新浦京娱乐场网站 55

6.jpg

因此当前页数与终极一页页数做比较,若同样则注明当前页为最终一页。

select_tag = soup.find('select', attrs={'name': 'sldd'})
option_list = select_tag.find_all('option')

last_option = option_list[-1]
current_option = select_tag.find('option' ,attrs={'selected': True})

is_last = (last_option.string == current_option.string)

现阶段不为最终一页,则继续对下一页做一样的处理,乞求照旧通过回调parse措施做管理

if not is_last:
    next_page = 'http://www.xeall.com/shenshi/'   page_a_list[-2]['href']
    if next_page is not None:
        print('n------ parse next page --------')
        print(next_page)
        yield scrapy.Request(next_page, callback=self.parse)

经过一样的章程挨个拍卖每一页,直到全数页处理完了。

 澳门新浦京娱乐场网站 56

爬取漫画图片

parse格局中领到到当前页的兼具漫画url时,就能够初始对每部漫画进行拍卖。

在获得到comics_url_list数组的世间加上上面代码:

for url in comics_url_list:
    yield scrapy.Request(url=url, callback=self.comics_parse)

对每部漫画的url举办呼吁,回调解和管理理方式为self.comics_parsecomics_parse措施用来拍卖每部漫画,上边为切实贯彻。

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

当前页图片

首相将央求再次回到的源码构造一个BeautifulSoup,和前边基本一致

def comics_parse(self, response):
    content = response.body;
    soup = BeautifulSoup(content, "html5lib")

领取选择页控件标签,页面呈现和源码如下所示

澳门新浦京娱乐场网站 57

7.jpg

澳门新浦京娱乐场网站 58

8.jpg

提取classpagelistul标签

page_list_tag = soup.find('ul', class_='pagelist')

查看源码能够观察当前页的li标签的class属性thisclass,以此博得到当下页页数

current_li = page_list_tag.find('li', class_='thisclass')
page_num = current_li.a.string

当前页图片的价签和对应源码

澳门新浦京娱乐场网站 59

9.jpg

澳门新浦京娱乐场网站 60

10.jpg

获取当前页图片的url,以及漫画的标题。漫画标题之后用来作为存储对应漫画的文本夹名称。

li_tag = soup.find('li', id='imgshow')
img_tag = li_tag.find('img')

img_url = img_tag['src']
title = img_tag['alt']

 

保留到地面

当提取到图片url时,便可由此url央求图片并保存到本地

self.save_img(page_num, title, img_url)

概念了二个特意用来保存图片的措施save_img,具体完整兑现如下

# 先导入库
import os
import urllib
import zlib

def save_img(self, img_mun, title, img_url):
    # 将图片保存到本地
    self.log('saving pic: '   img_url)

    # 保存漫画的文件夹
    document = '/Users/moshuqi/Desktop/cartoon'

    # 每部漫画的文件名以标题命名
    comics_path = document   '/'   title
    exists = os.path.exists(comics_path)
    if not exists:
        self.log('create document: '   title)
        os.makedirs(comics_path)

    # 每张图片以页数命名
    pic_name = comics_path   '/'   img_mun   '.jpg'

    # 检查图片是否已经下载到本地,若存在则不再重新下载
    exists = os.path.exists(pic_name)
    if exists:
        self.log('pic exists: '   pic_name)
        return

    try:
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        headers = { 'User-Agent' : user_agent }

        req = urllib.request.Request(img_url, headers=headers)
        response = urllib.request.urlopen(req, timeout=30)

        # 请求返回到的数据
        data = response.read()

        # 若返回数据为压缩数据需要先进行解压
        if response.info().get('Content-Encoding') == 'gzip':
            data = zlib.decompress(data, 16   zlib.MAX_WBITS)

        # 图片保存到本地
        fp = open(pic_name, "wb")
        fp.write(data)
        fp.close

        self.log('save image finished:'   pic_name)

    except Exception as e:
        self.log('save image error.')
        self.log(e)

函数重要用到3个参数,当前图片的页数,漫画的名号,图片的url。

图形会保存在以漫画名称命名的文书夹中,若不设有对应文件夹,则开创二个,一般在得到第一张图时索要自主要创作办四个文件夹。

document为地面钦命的公文夹,可自定义。

每张图片以页数.jpg的格式命名,若本地已存在同名图片则不再进行重新下载,一般用在频仍初叶职责的状态下开始展览判别以幸免对已存在图片展开再一次央浼。

呼吁重返的图纸数据是被缩减过的,能够通过response.info().get('Content-Encoding')的体系来进行判别。压缩过的图纸要先经过zlib.decompress解压再保存到地面,不然图片打不开。

轮廓实现思路如上,代码中也沾满注释了。

猎取图片url链接

下一页图片

和在漫画列表分界面中的管理格局类似,在漫画页面中大家也必要不停得到下一页的图样,不断的遍历直至最终一页。

澳门新浦京娱乐场网站 61

11.jpg

当下一页标签的href属性为#时为漫画的结尾一页

a_tag_list = page_list_tag.find_all('a')
next_page = a_tag_list[-1]['href']
if next_page == '#':
    self.log('parse comics:'   title   'finished.')
else:
    next_page = 'http://www.xeall.com/shenshi/'   next_page
    yield scrapy.Request(next_page, callback=self.comics_parse)

若当前为最后一页,则该部漫画遍历达成,不然继续通过一致格局处理下一页

yield scrapy.Request(next_page, callback=self.comics_parse)

  分析页面内容,含有图片链接的img标签中有一个alt属性的值是跟图集名称一致,能够用那一个来平昔找到这些标签,当然也能够先找到div标签中的class属性是main-inage,再找到img的src属性,这里笔者就利用第一种方法。

运作结果

大约的兑现核心到位,运维起来,能够看看调控台打字与印刷情状

澳门新浦京娱乐场网站 62

12.jpg

当半夏件夹保存到的图样

澳门新浦京娱乐场网站 63

13.jpg

scrapy框架运行的时候利用了多线程,可以看到多部卡通是还要开始展览爬取的。

对象网址财富服务器以为非常快,会日常出现央浼超时的场合。跑的时候请耐心等待。:)

澳门新浦京娱乐场网站 64

最后

本文介绍的只是scrapy框架极其基本的用法,还应该有各个一点也不粗节的特征配置,如使用FilesPipelineImagesPipeline来保存下载的文书大概图片;框架自己自带了个XPath类用来对网页音讯进行领取,这些的功用要比BeautifulSoup高;也可以由此特意的item类将爬取的多寡结果保存作为三个类重返。具体请查阅官方网站。

末尾附上完整Demo源码,假设我报告您实际指标网址是有利你会给个star么?-_-

Python爬虫之爬取美女图片,Python漫画爬虫两弹。完。

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']

 

将图片存入本地

  收获图片url链接之后要讲图片存到本地,在伏乞图片url的时候要参预Picreferer,否则网址会感觉你是一个爬虫,会返还给你一个盗链图

该方法传入的参数有3个,第贰个是图片url,第1个当前图片的页数,用作创造文件,第八个是图集名称,在蕴藏从前先创建了五个名称是图集名称的文件夹,那样就能够将图纸存入内定文件夹

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)

 

爬取二个图集完整代码

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()

 

  在main方法中先央浼到图集的名称和最大页数,并且使用名称创造贰个文书夹来囤积图片。再从1到最大页数做多少个for循环,

接下来图片的每一页是     图集首页  / 现阶段页数,获取含有图片内容的url链接,前面就足以将收获图片存入本地。

 

爬取结果

澳门新浦京娱乐场网站 65

 

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

 

 

 

上面希图上马多个页面包车型地铁爬取,先将前方爬取三个图集的办法实行包装

爬取叁个图集

在展开爬取二个图集前先投入四个主意,在爬取图集名称的时候,由于名称的字符不限,所以也许出现含有文件夹中无法出现的一部分字符,举例:/ : ? < > 等

故而要求将日前的代码进行改造,出席三个rename方法,将这么些字符换来可行的字符。(在此间笔者就平昔将那几个字符去掉)

那边运用re库,将name中涵盖的地下字符换来空,能够当做间接去掉。

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   "保存成功")

 

爬取一整页图集

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

深入分析一个页面中的url链接,开采只要找 target="_blank" 这一性质,则会发出好多余下的链接,所以自个儿直接从字标签入手找到属性 class="lazy"的img标签,然后再在检索到img标签的父标签中的href

def save_one_page(start_url):
    atlas_url = get_atlas_list(start_url)
    for url in atlas_url:
        save_one_atlas(url)

将爬取一整夜图集举行打包,方便后续的翻页爬取

 

翻页爬取

浅析页面url,开采每一页均是从头网站 page/ 页数/

第一页是开头网址,然而页数为1的链接也是一贯进入第一页,所以全部页的url就可以用上述通式退换页数实行遍历。

 

start_url = "http://www.mzitu.com/"
    for count in range(1, 3):
        url = start_url   "page/"   str(count)  "/"
        save_one_page(url)

 

那边当做测量检验,所以只爬取前两页图集。更换range内的参数,就可以改造爬取页数。

 

一体化代码

澳门新浦京娱乐场网站 66澳门新浦京娱乐场网站 67

 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("爬取完成")

View Code

 

以此程序能够爬取图片,不过效能太低,正在攻读多进度,希望今后能够增加该程序的爬取效用。

本人爬了3个多G的图形花了本人好像4个小时,足以注脚作用是真的低。

再正是在爬取进程中冒出三个标题,提醒 你的主机中的软件中止了一个已塑造的连天 ,那一个主题素材还未找到化解方法,也未找明发生的切切实实原因。

这是自身写的第一篇较长的博客,还应该有诸多未健全的地点,希望我们见谅。

 

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:Python爬虫之爬取美女图片,Python漫画爬虫两弹