• python简易爬虫来实现自动图片下载


      菜鸟新人刚刚入住博客园,先发个之前写的简易爬虫的实现吧,水平有限请轻喷。

      估计利用python实现爬虫的程序网上已经有太多了,不过新人用来练手学习python确实是个不错的选择。本人借鉴网上的部分实现加以改造实现网页图片地址提取和下载。首先找到你感兴趣的网页,以bbs论坛为例,查看网页的源代码发现图片下载的链接地址类似如下:

    <p class="imgtitle">
    <a href="attachment.php?aid=48812&amp;k=176431dd98231d60e6614082ac2ce5b9&amp;t=1387945675&amp;fid=4&amp;nothumb=yes&amp;sid=4398hG%2BmnnlYG4UAc6QgsughqDa2Svrm7MIu8tShB1s%2F3QI" onmouseover="showMenu(this.id,false,2)" id="aid48812" class="bold" target="_blank">img-fa6533d1b03dee194f0636a69eea5c64.jpg</a>

      所以找到了属性href值就可以解析出我们的下载地址了(要加入当前url前缀才是绝对地址呦)。用python写个处理网页的函数可以这样

     1 def getImg(html,page):
     2     reg = r'attachment.php?.+" '
     3     imgre = re.compile(reg)
     4     imglist = imgre.findall(html)
     5     x = 0
     6     import os
     7     path = "d:\picture\"
     8     title = "%s\" %page 
     9     new_path = os.path.join(path, title)
    10     if not os.path.isdir(new_path):
    11         os.makedirs(new_path)
    12     
    13     for imgurl in imglist:
    14         imgurl=imgurl[:imgurl.find('"')]
    15         imgurl=imgurl.rstrip('"')
    16         print imgurl
    17         imgurl="http://xxxxxx/"+imgurl
    18         f = urllib2.urlopen(imgurl)
    19         with open(new_path+"%s.gif" % x, "wb") as code:
    20             code.write(f.read())
    21             x = x + 1  

    以上用的是最简单的正则匹配,将解析后的图片下载保存到D盘picture目录。
     有时候论坛是要登录的,所以处理模拟登录这块根据你所处理的网站会稍许不同,实现模拟登陆功能大部分是提交登陆表单。这里就要用到python发送登陆表单请求消息了,利用httpfox插件获取登陆的post信息,

     1 ef login(weburl,username,password,page):
     2     cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar())
     3     opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
     4     urllib2.install_opener(opener)
     5     postdata=urllib.urlencode({ 
     6                            'loginfield':'username',
     7                            'formhash':gethash(weburl),    
     8                             'password':password,
     9                             'username':username,   
    10                             'questionid':0, 
    11                             'answer':'',
    12                             'loginsubmit':'true'})
    13     postdata=postdata.encode(encoding='UTF8') 
    14     header = {'User-Agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)'}
    15     posturl=weburl
    16     req = urllib2.Request(posturl,postdata)
    17     result = urllib2.urlopen(req).read()
    18     Url="http://xxxxxxxxxx/viewthread.php?tid=14943&extra=page%3D1&page=" 
    19     Url=Url+("%s" % page)
    20     result=getHtml(Url);
    21     return result
    View Code

    到这边都是比较简单实现的,稍微麻烦点的是请求表单中postdata中需要获取随机的hash值,因此首先要解析出你登陆界面中的那个formhash,这个用re模块简单解析处理一下就ok了

     1 def gethash(url):
     2     page = urllib2.urlopen(url)
     3     html = page.read()
     4     reg = r'name="formhash" value=".+"'
     5     hashre = re.compile(reg)
     6     hashvalue=hashre.findall(html)
     7     pos=(hashvalue[0]).index('value=')
     8     hash=(hashvalue[0])[pos+6:]
     9     print hash.strip('"')
    10     return hash.strip('"')
    View Code

    ,以上就是用到的大部分函数了,当然解析网页还有更多的好用的模块比如beautifulsoup等等,简单研究一下应该就能实现一个简易的爬虫程序了。

    第一次在园子写东西,写的比较乱,以后改进。接下来准备介绍一下如何用python实现一个RSS阅读器。

  • 相关阅读:
    subplots
    异步方法:用async关键字修饰的方法
    async、await原理揭秘
    TCP/IP概述
    EFCore中的IEnumerable和IQueryable的不同之处
    IQueryable底层是如何读取数据的?
    二叉树性质
    几种查找算法
    EFCore中所谓IQueryable
    常用位运算
  • 原文地址:https://www.cnblogs.com/lophy/p/3490447.html
Copyright © 2020-2023  润新知