python3爬取1024图片

这两年python特别火,火到博客园现在也是隔三差五的出现一些python的文章。各种开源软件、各种爬虫算法纷纷开路,作为互联网行业的IT狗自然看的我也是心痒痒,于是趁着这个雾霾横行的周末瞅了两眼,作为一名老司机觉得还是应该以练带学,1024在程序员界这么流行的网站,当然拿来先练一练。

python自称是以自然语言的视角来编程,特点是开发快,语言简洁,没那么多技巧,大名鼎鼎的豆瓣、youtube都是使用python开发的网站,看来python在大规模使用这个方面来讲应该没有啥子问题;python也不是没有缺点在性能方面就Java、C++等老前辈还是没得比的,另外python和nodejs一样只能使用CPU单核,也是性能方面影响是因素之一。但python在特定领域表现突出,特别是脚本、爬虫、科学算法等。

好了,还是说正事如何爬取1024网站的图片

分析

列表页面

首先进入1024的导航网站,随便点击一个地址进入选择图片区或者在网站地址后面添加thread0806.php?fid=16&search=&page=,这就是1024网站的图片区,这个爬虫就是主要抓取这个区域的所有图片,使用浏览器debug分析一下这个页面发现基本都是列表页,格式如下:

在地址栏http://xxxxxx.biz/thread0806.php?fid=16&search=&page=后面拼1、2、3等于就是访问图片区第一页、第二页、第三页的列表页。根据这些列表页就可以爬出具体的每一个图片页的地址,类似上图的地址:htm_data/16/1611/2114702.html 在地址的前面拼接上主站地址就是具体的图片页了。所以根据以上的分析:通过循环地址栏找到不同的列表页在根据列表页找到具体的图片页

地址栏->图片列表->图片页地址

获取列表页图片地址代码如下:

import urllib.request,socket,re,sys,os

baseUrl='http://xxxx.biz/'

def getContant(Weburl):
    Webheader= {'Upgrade-Insecure-Requests':'1',
                'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36',}
    req = urllib.request.Request(url = Weburl,headers=Webheader)
    respose = urllib.request.urlopen(req)
    _contant = respose.read()
    respose.close()
    return str(_contant)

def getUrl(URL):
    pageIndex = 1
    for i in range(1,int(pageIndex)+1):
        Weburl = URL + str(i)
        contant = getContant(Weburl)
        comp = re.compile(r'<a href="htm_data.{0,30}html" target="_blank" id=""><font color=g')
        urlList1 = comp.findall(contant)
        comp = re.compile(r'a href="(.*?)"')
        urlList2 = comp.findall(str(urlList1))
        urlList = []
        for url1 in urlList2:
            url2 = baseUrl+url1
            urlList.append(url2)
        return urlList

URL = baseUrl+'thread0806.php?fid=16&search=&page='
UrlList = getUrl(URL)
print(UrlList)

在这个地址后面拼接1到N就是不同的列表页

图片页面

利用浏览器debug一下页面,图片基本上都是外链地址,以http或者https开头以jpg、png、gif结尾,写个正则表达式匹配这些地址,然后交给程序下载就OK了。

页面代码如下:

在下载过程中遇到了几个问题,就是有的页面会报403禁止访问等,应该是网站加了一些防止爬虫的手段,网上找了下加上header参数来模拟浏览器访问就解决了;

下载单个页面代码如下:

import urllib.request,socket,re,sys,os

#定义文件保存路径
targetPath = "D:\\temp\\1024\\1"

def openUrl(url):
    headers = {
                  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '                            'Chrome/51.0.2704.63 Safari/537.36'
               }

    req = urllib.request.Request(url=url, headers=headers)
    res = urllib.request.urlopen(req)
    data = res.read()
    downImg(data)

def downImg(data):
    for link,t in set(re.findall(r'([http|https]:[^\s]*?(jpg|png|gif))', str(data))):

        if link.startswith('s'):
            link='http'+link
        else:
            link='htt'+link
        print(link)
        try:
            opener=urllib.request.build_opener()
            opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
            urllib.request.install_opener(opener)
            urllib.request.urlretrieve(link,saveFile(link))
        except:
            print('失败')

def saveFile(path):
    #检测当前路径的有效性
    if not os.path.isdir(targetPath):
        os.mkdir(targetPath)

    #设置每个图片的路径
    pos = path.rindex('/')
    t = os.path.join(targetPath,path[pos+1:])
    return t

url = "http://xxxx.biz/htm_data/16/1611/2115193.html"
openUrl(url)

批量爬取

批量爬取有两个工作要做,第一for循环目标内的所有列表页,第二为了避免重复爬取,需要给每个页面建立唯一的文件夹,下次爬取的时候如果存在直接跳过。最后在理一下所有的爬取步骤:

循环地址栏->找出图片页列表->图片页分析找出图片地址->为图片页建立唯一的文件夹->开始下载页面图片

完整的代码如下:

import urllib.request,socket,re,sys,os

baseUrl='http://xxxx.biz/'
targetPath = "D:\\temp\\1024\\"

def getContant(Weburl):
    Webheader= {'Upgrade-Insecure-Requests':'1',
                'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36',}
    req = urllib.request.Request(url = Weburl,headers=Webheader)
    respose = urllib.request.urlopen(req)
    _contant = respose.read()
    respose.close()
    return str(_contant)

def getUrl(URL):
    pageIndex = 1
    for i in range(1,int(pageIndex)+1):
        Weburl = URL + str(i)
        contant = getContant(Weburl)
        comp = re.compile(r'<a href="htm_data.{0,30}html" target="_blank" id=""><font color=g')
        urlList1 = comp.findall(contant)
        comp = re.compile(r'a href="(.*?)"')
        urlList2 = comp.findall(str(urlList1))
        urlList = []
        for url1 in urlList2:
            url2 = baseUrl+url1
            urlList.append(url2)
        return urlList

def openUrl(url):
    headers = {
                  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '                            'Chrome/51.0.2704.63 Safari/537.36'
               }

    filePath=targetPath+url[-12:-5]
    #检测当前路径的有效性
    if not os.path.isdir(filePath):
        os.mkdir(filePath)
        req = urllib.request.Request(url=url, headers=headers)
        res = urllib.request.urlopen(req)
        data = res.read()
        downImg(data,filePath)
    else:
        print("已经下载过的地址跳过:"+url)
        print("filePath  "+filePath)

def downImg(data,filePath):
    for link,t in set(re.findall(r'([http|https]:[^\s]*?(jpg|png|gif))', str(data))):

        if link.startswith('s'):
            link='http'+link
        else:
            link='htt'+link
        print(link)
        try:
            opener=urllib.request.build_opener()
            opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
            urllib.request.install_opener(opener)
            urllib.request.urlretrieve(link,saveFile(link,filePath))
        except:
            print('失败')

def saveFile(path,filePath):
    #设置每个图片的路径
    pos = path.rindex('/')
    t = os.path.join(filePath,path[pos+1:])
    return t

def openPage(UrlList):
    for pageUlr in UrlList:
        try:
            print('正在下载地址:'+pageUlr)
            openUrl(pageUlr)
        except:
            print('地址:'+pageUlr+'下载失败')

URL = baseUrl+'thread0806.php?fid=16&search=&page='
for num in range(0,20):#0-20页
    print("#######################################")
    print("##########总目录下载地址###############")
    print(URL+str(num))
    print("#######################################")
    print("#######################################")
    UrlList = getUrl(URL+str(num))
    openPage(UrlList)

最后的爬取结果:

源代码地址:python-crawler
具体地址和源代码在一起

其它

关于python2和python3的争论,网站争论比较大python3不兼容pyhton2,很多第三方的类库暂时还没有支持python3等等,但是对于我们新手来说,肯定是往前看果断python3.

代码比较冗余几个地方还没有写好,还在慢慢学习中,目前只是搞的可以跑起来。还有几个问题没有解决,下载一段时间后会莫名其妙的断掉目前还么找到原因,后期看是否可以加上多线程来爬取可能会快一点,大家有什么更好的建议也可以提出来。

参考:

爬取豆瓣首页图片

使用Python爬取1024上的图片



作者:纯洁的微笑
出处:http://www.ityouknow.com/
版权所有,欢迎保留原文链接进行转载:)

时间: 2024-09-29 03:57:29

python3爬取1024图片的相关文章

python3 爬取https指向的图片链接 问题

问题描述 python3 爬取https指向的图片链接 问题 初学python爬虫部分,昨天动手做了做爬取网页图片并且下载的小程序.发现网页中有的图片可以被下载并且保存在本地,有的却不能.查看了下网页代码原来可以被爬取的是而不能被爬取的是用urllib包好像处理不了 请问如何解决 附上程序报错提示Traceback (most recent call last): File ""D:Python34liburllib equest.py"" line 1182 in

Python爬取三国演义的实现方法_python

本文的爬虫教程分为四部:      1.从哪爬 where      2.爬什么 what      3.怎么爬 how      4.爬了之后信息如何保存 save 一.从哪爬 三国演义 二.爬什么 三国演义全文 三.怎么爬 在Chrome页面打开F12,就可以发现文章内容在节点 <div id="con" class="bookyuanjiao"> 只要找到这个节点,然后把内容写入到一个html文件即可. content = soup.find(&q

浅谈Python爬取网页的编码处理_python

背景 中秋的时候一个朋友给我发了一封邮件说他在爬链家的时候发现网页返回的代码都是乱码让我帮他参谋参谋(中秋加班真是敬业= =)其实这个问题我很早就遇到过之前在爬小说的时候稍微看了一下不过没当回事其实这个问题就是对编码的理解不到位导致的. 问题 很普通的一个爬虫代码代码是这样的 # ecoding=utf-8 import re import requests import sys reload(sys) sys.setdefaultencoding('utf8') url = 'http://j

Java通过UrlConnection和Httpclient实现爬取并保存至本地实例

下面是我简单实现爬取指定网页,并且保存的简单实现,其实有几种方式可以实现,这里慢慢添加该功能的几种实现方式. UrlConnection爬取实现 package html; import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.I

教你用python3根据关键词爬取百度百科的内容_python

前言 关于python版本,我一开始看很多资料说python2比较好,因为很多库还不支持3,但是使用到现在为止觉得还是pythin3比较好用,因为编码什么的问题,觉得2还是没有3方便.而且在网上找到的2中的一些资料稍微改一下也还是可以用. 好了,开始说爬百度百科的事. 这里设定的需求是爬取北京地区n个景点的全部信息,n个景点的名称是在文件中给出的.没有用到api,只是单纯的爬网页信息.  1.根据关键字获取url 由于只需要爬取信息,而且不涉及交互,可以使用简单的方法而不需要模拟浏览器. 可以直

[python爬虫] Selenium定向爬取海量精美图片及搜索引擎杂谈

        我自认为这是自己写过博客中一篇比较优秀的文章,同时也是在深夜凌晨2点满怀着激情和愉悦之心完成的.首先通过这篇文章,你能学到以下几点:        1.可以了解Python简单爬取图片的一些思路和方法         2.学习Selenium自动.测试分析动态网页和正则表达式的区别和共同点         3.了解作者最近学习得比较多的搜索引擎和知识图谱的整体框架         4.同时作者最近找工作,里面的一些杂谈和建议也许对即将成为应届生的你有所帮助         5.当

[python爬虫] Selenium定向爬取虎扑篮球海量精美图片

前言:          作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员还是写个程序来进行吧!         所以我通过Python+Selenium+正则表达式+urllib2进行海量图片爬取.        前面讲过太多Python爬虫相关的文章了,如爬取新浪博客.维基百科Infobox.百度百科.游迅网图片,也包括Selenium安装过程等等,

Python爬取淘宝模特图片网络爬虫示例

为了爬取模特的图片,我们首先要找到各个模特自己的页面.通过查看网页源码,我们可以发现,模特各自的页面的特点如下: 我们可以通过查找class属性为lady-name的标签,然后取其href属性来获取各个模特各自的页面地址. 1 html = urlopen(url) 2 bs = BeautifulSoup(html.read().decode('gbk'),"html.parser") 3 girls = bs.findAll("a",{"class&q

python爬取NUS-WIDE数据库图片_python

实验室需要NUS-WIDE数据库中的原图,数据集的地址为http://lms.comp.nus.edu.sg/research/NUS-WIDE.htm   由于这个数据只给了每个图片的URL,所以需要一个小爬虫程序来爬取这些图片.在图片的下载过程中建议使用VPN.由于一些URL已经失效,所以会下载一些无效的图片. # PYTHON 2.7 Ubuntu 14.04 nuswide = "$NUS-WIDE-urls_ROOT" #the location of your nus-wi