首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

【python抓站】遇到有关问题。求高人指点

2013-02-24 
【python抓站】遇到问题。。求高人指点小弟新学python,想做一个抓站的小程序练一下手。具体来说,就是随便找了一

【python抓站】遇到问题。。求高人指点
小弟新学python,想做一个抓站的小程序练一下手。具体来说,就是随便找了一个漫画的网站,然后想能够把某一部漫画完整地抓下来
但是在获取大图片的url时出现了问题。比如下面这个网址
http://comic.131.com/content/16117/187873/3.html

【python抓站】遇到有关问题。求高人指点

显然,我需要获取最大的那张图的url。对于131这个网站来说,它的漫画的主图片的id叫做ComicBigPic

<img id="comicBigPic" src="http://res6.comic.131.com/ab/f2/bcd0da3723fa0293f33c1ca3d626f8b014b6.jpg" alt="【python抓站】遇到有关问题。求高人指点" oncontextmenu="return false;">


相关的python代码如下:

import html.parser
import urllib.request

class parseEpisode(html.parser.HTMLParser):
    def handle_starttag(self,tag,attrs):
        if tag == 'img':
            istarget = 0
            for key,value in attrs:
                if key == 'id' and value == 'comicBigPic':
                    print(attrs)
                    istarget = 1
                if key == 'src' and istarget:
                    istarget = 0
                    self.picurl = value

page = parseEpisode()
response = urllib.request.urlopen('http://comic.131.com/content/16117/187873/3.html')
page.feed(response.read().decode('utf-8'))


然后非常奇怪的是,输出的图片的src居然和在网站上看到的不一样。。输出的是这个:
[('id', 'comicBigPic'), ('src', 'http://res.files.131.com/t.gif'), ('alt', '魔物娘的(相伴)日常-第10话-少年漫画-オカヤド@乾武丸'), ('oncontextmenu', 'return false;')]

而原来应该是:http://res6.comic.131.com/ab/f2/bcd0da3723fa0293f33c1ca3d626f8b014b6.jpg 才对
我实在不知道是怎么回事。试过改headers也不行,我对于网站的原理不是很熟悉。难道有什么机制来在爬虫访问的时候修改src?? python 抓站 HTML 爬虫
[解决办法]
我用低版本的chrome也和firefox/ie一样,没有装新版的chrome
[解决办法]
我测试了19张图片,基本没啥问题.
#! /urs/bin/env python
# coding: cp936

import re
import urllib

url = r'http://comic.131.com/content/16117/187873/2.html'
url_base = url[:url.rfind('/')+1]

res_bounds = r'option value="(\d+)"'
res_img = r'id="imgjs".*?img=(http://.*?)"'

def getSource(url):
    ''' get source of the page '''
    page = urllib.urlopen(url)
    if page:
        return page.read()
    else:
        return ''


def main():
    ''' main function '''
    page = getSource(url)


    img_dir = r'E:\test\test\\'
    if page:
        m = re.findall(res_bounds,page,re.S
[解决办法]
re.M)
        if m:
            lower_bound = int(m[0])
            upper_bound = int(m[-1])
            print '图片范围: [%d - %d]' % (lower_bound, upper_bound)
            for i in range(lower_bound,upper_bound+1):
                print '获取页面', i, '.html 的内容...'
                img_page = getSource(url_base+str(i)+'.html')
                if img_page:
                    print '\t处理第', i, ' 张图片地址...'
                    img_url = re.findall(res_img,img_page,re.S
[解决办法]
re.M)
                    if img_url:
                        urllib.urlretrieve(img_url[0],img_dir+str(i)+'.jpg')
                        print '\t第', i, '张图片已保存'
                    else:
                        print '\t获取第', i, ' 张图片地址出错'
                else:
                        print '指定网页', i, '.html 不包含图片'
                img_page = ''
    print '完成'

# unit test
if __name__=='__main__':
    main()
        


测试:
图片范围: [1 - 31]
获取页面 1 .html 的内容...
处理第 1  张图片地址...
第 1 张图片已保存
获取页面 2 .html 的内容...
处理第 2  张图片地址...
第 2 张图片已保存
获取页面 3 .html 的内容...
处理第 3  张图片地址...
第 3 张图片已保存
获取页面 4 .html 的内容...
处理第 4  张图片地址...
第 4 张图片已保存
获取页面 5 .html 的内容...
处理第 5  张图片地址...
第 5 张图片已保存
获取页面 6 .html 的内容...
处理第 6  张图片地址...
第 6 张图片已保存
获取页面 7 .html 的内容...
处理第 7  张图片地址...


第 7 张图片已保存
获取页面 8 .html 的内容...
处理第 8  张图片地址...
第 8 张图片已保存
获取页面 9 .html 的内容...
处理第 9  张图片地址...
第 9 张图片已保存
获取页面 10 .html 的内容...
处理第 10  张图片地址...
第 10 张图片已保存
获取页面 11 .html 的内容...
处理第 11  张图片地址...
第 11 张图片已保存
获取页面 12 .html 的内容...
处理第 12  张图片地址...
第 12 张图片已保存
获取页面 13 .html 的内容...
处理第 13  张图片地址...
第 13 张图片已保存
获取页面 14 .html 的内容...
处理第 14  张图片地址...
第 14 张图片已保存
获取页面 15 .html 的内容...
处理第 15  张图片地址...
第 15 张图片已保存
获取页面 16 .html 的内容...
处理第 16  张图片地址...
第 16 张图片已保存
获取页面 17 .html 的内容...
处理第 17  张图片地址...
第 17 张图片已保存
获取页面 18 .html 的内容...
处理第 18  张图片地址...
第 18 张图片已保存
获取页面 19 .html 的内容...
处理第 19  张图片地址...

热点排行