免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2724 | 回复: 9
打印 上一主题 下一主题

已解决,勿进 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-05 22:03 |只看该作者 |倒序浏览
本帖最后由 laike9m 于 2013-02-07 15:58 编辑

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


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

  1. <div style="position:relative;margin:0 auto; text-align:center;">   
  2.             <a href="http://comic.131.com/content/16117/187873/4.html"><img id="comicBigPic" src="./魔物娘的(相伴)日常-第10话-少年漫画-恋爱,人外,妖怪,杀必死-オカヤド@乾武丸-漫画频道-131游戏之家.._files/bcd0da3723fa0293f33c1ca3d626f8b014b6.jpg" alt="魔物娘的(相伴)日常-第10话-少年漫画-オカヤド@乾武丸" oncontextmenu="return false;"></a>
  3. </div>
复制代码
相关的python代码如下:

  1. import html.parser
  2. import urllib.request

  3. class parseEpisode(html.parser.HTMLParser):
  4.     def handle_starttag(self,tag,attrs):
  5.         if tag == 'img':
  6.             istarget = 0
  7.             for key,value in attrs:
  8.                 if key == 'id' and value == 'comicBigPic':
  9.                     print(attrs)
  10.                     istarget = 1
  11.                 if key == 'src' and istarget:
  12.                     istarget = 0
  13.                     self.picurl = value

  14. page = parseEpisode()
  15. response = urllib.request.urlopen('http://comic.131.com/content/16117/187873/3.html')
  16. page.feed(response.read().decode('utf-8'))
复制代码
然后非常奇怪的是,输出的图片的src居然和在网站上看到的不一样。。输出的是这个:
  1. [('id', 'comicBigPic'), ('src', 'http://res.files.131.com/t.gif'), ('alt', '魔物娘的(相伴)日常-第10话-少年漫画-オカヤド@乾武丸'), ('oncontextmenu', 'return false;')]
复制代码
而原来应该是:http://res6.comic.131.com/ab/f2/ ... ca3d626f8b014b6.jpg 才对
我实在不知道是怎么回事。试过改headers也不行,我对于网站的原理不是很熟悉。难道有什么机制来在爬虫访问的时候修改src??

搜狗截图130205_1.png (307.15 KB, 下载次数: 27)

搜狗截图130205_1.png

论坛徽章:
0
2 [报告]
发表于 2013-02-05 22:46 |只看该作者
简答:
是需要你先(用工具)分析出原先的逻辑,然后再去用python实现的。

详解:
你所需要的,所有的内容,都可以在这里找到:
如何用Python,C#等语言去实现抓取静态网页+抓取动态网页+模拟登陆网站

论坛徽章:
0
3 [报告]
发表于 2013-02-05 23:46 |只看该作者
回复 2# crifan

没想到crifan大神能在这里现身,之前就看过你blog里的东西。
你给的那篇及引用的几篇我看了,确实讲的很清楚,不过似乎没什么帮助。对于获取页面http代码的这个过程我还是比较清楚地,因为不涉及登陆所以也用不着cookie,只要简单用我的那部分代码应该就行了。
我没有用beautiful soup,因为它和使用python自带的HTMLParser类来派生自己的类一样,第一部都是由urllib.request.urlopen获得信息,只不过接下来的处理不同
我完整输出urllib.request.urlopen的文字(即页面完整的http代码),发现看到的那个图片的src已经和在网页上不一样了,即和后续处理没有关系。

所以关键问题是那个src的值为什么会和看到的不一样。我用的浏览器是chrome 25.0.1364.5。用别的浏览器看过,不太一样,有的在浏览器里面看是和python提取的src一样,是http://res.files.131.com/t.gif
有的是和chrome里面看到的一样,是http://res6.comic.131.com/ab/f2/ ... ca3d626f8b014b6.jpg
但显然,长的那个才是真实url,短的那个是完全无关的一张图片
   

论坛徽章:
0
4 [报告]
发表于 2013-02-06 12:32 |只看该作者
大体问题清楚了,那张图片是不会在一开始就加载出来的。现在正在考虑控制浏览器访问

论坛徽章:
0
5 [报告]
发表于 2013-02-06 17:34 |只看该作者
“所以关键问题是那个src的值为什么会和看到的不一样。”
1.找个,可以正常获得你的图片的浏览器。
2.然后用对应工具分析出具体的流程
主要是相关的agent,cookie等等信息
3.再去用python实现。

而如果你本身的:
agent
cookie
post data
等等,其中任何一个模拟的不准确,都可以导致无法获得你所需要的数据
所以需要你自己分析清楚后,才能再去用代码实现的。
没搞懂背后的核心逻辑之前,随便写代码,是没啥意义的。

论坛徽章:
0
6 [报告]
发表于 2013-02-07 14:39 |只看该作者
回复 5# crifan


    我大概明白你的意思了。先应该弄清图片来源

论坛徽章:
0
7 [报告]
发表于 2013-02-07 15:57 |只看该作者
回复 2# crifan


    恩现在彻底解决了,是我之前太傻。非常感谢大神的点拨

论坛徽章:
0
8 [报告]
发表于 2013-02-18 10:48 |只看该作者
解决后能否贴上能用的源代码,供后来者参考?

论坛徽章:
0
9 [报告]
发表于 2013-02-21 10:12 |只看该作者
本帖最后由 laike9m 于 2013-02-21 10:15 编辑

回复 8# freedos520

那就贴上来吧,不过感觉大家都不会有这种弱智问题的。。
  1.    def handle_starttag(self,tag,attrs):
  2.         if tag == 'script':
  3.             istarget = 0         
  4.             for key,value in attrs:
  5.                 if key == 'id' and value == 'imgjs':
  6.                     istarget = 1
  7.                 if key == 'src' and istarget:
  8.                     istarget = 0
  9.                     patt = r"\?img=([^& ]+)"
  10.                     matchobj = re.search(patt,value)
  11.                     self.picurl = matchobj.group(1)
复制代码
这段就是用正则来匹配一个形如:
  1. value = http://131js.131.com/channel/comic/img.js?img=http://res6.comic.131.com/ab/f2/bcd0da3723fa0293f33c1ca3d626f8b014b6.jpg
复制代码
的字符串,然后把img=的值提取出来。当然在这之前需要锁定script标签,原因见前面的帖子

论坛徽章:
0
10 [报告]
发表于 2013-02-21 12:40 |只看该作者
laike9m 发表于 2013-02-21 10:12
回复 8# freedos520

那就贴上来吧,不过感觉大家都不会有这种弱智问题的。。这段就是用正则来匹配一个形 ...


很好,谢谢。

每个人在学习的过程中,都会遇到一些在后来看起来很“弱智”的问题的。这是成长的一个过程嘛。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP