Python编写抓取网页上图片的连接,报错如下 怎么解决 以前运行这个程序 不出这样的错

Python013

Python编写抓取网页上图片的连接,报错如下 怎么解决 以前运行这个程序 不出这样的错,第1张

df['pic_url']=pic_urls 数值的长度 和 索引的长度 不匹配

自己调试一下吧。

或者 把 main.py 的 46行 上下的代码 粘贴出来

真实图片地址是在客户端javascript代码中计算出来的.

你需要寻找

<span class="img-hash">Ly93dzMuc2luYWltZy5jbi9tdzYwMC8wMDczdExQR2d5MWZ3Z3h6ajlrMGtqMzBpYjBramtnaS5qcGc=</span>

这样的内容,取出

Ly93dzMuc2luYWltZy5jbi9tdzYwMC8wMDczdExQR2d5MWZ3Z3h6ajlrMGtqMzBpYjBramtnaS5qcGc=

这段内容,做base64解码即得图片地址。

相应的脚本在

//cdn.jandan.net/static/min/91798e4c623fa60181a31d543488217eB2GDr79r.03100001.js

这段内容你通过get_page()爬到地页面中有,同样,该页面中有这样的html(为便于阅读已重排格式):

<div class="text">

  <span class="righttext">

    <a href="//jandan.net/ooxx/page-34#comment-4001800">4001800</a>

  </span>

  <p>

    <img src="//img.jandan.net/img/blank.gif" onload="jandan_load_img(this)" />

    <span class="img-hash">Ly93dzMuc2luYWltZy5jbi9tdzYwMC8wMDczdExQR2d5MWZ3Z3h6ajlrMGtqMzBpYjBramtnaS5qcGc=</span>

  </p>

</div>

这个img的onload调用的函数就在前面给出的那个js文件中:

function jandan_load_img(b){

  var d=$(b)

  var f=d.next("span.img-hash")

  var e=f.text()

  f.remove()

  var c=jdDw3Ldvi4NcbKboi4X19hCAmdC3Q3aZvN(e,"DGmLfT4H73yJdXXpXs3pw7uAiICcflZS")

  var a=$('<a href="'+c.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.(gif|jpg|jpeg))/,"$1large$3")+

          '" target="_blank" class="view_img_link">[查看原图]</a>')

  d.before(a)

  d.before("<br>")

  d.removeAttr("onload")

  d.attr("src",location.protocol+c.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.gif)/,"$1thumb180$3"))

  if(/\.gif$/.test(c)){

    d.attr("org_src",location.protocol+c)

    b.onload=function(){

      add_img_loading_mask(this,load_sina_gif)

  }

}

它调用了jdDw3Ldvi4NcbKboi4X19hCAmdC3Q3aZvN对img-hash的内容做解码,这个函数同样在这个js文件中:

var jdDw3Ldvi4NcbKboi4X19hCAmdC3Q3aZvN=function(o,y,g){

  var d=ovar l="DECODE"

  var y=y?y:""

  var g=g?g:0

  var h=4

  y=md5(y)

  var x=md5(y.substr(0,16))

  var v=md5(y.substr(16,16))

  ...中间部分略去...

  if(l=="DECODE"){

    m=base64_encode(m)

    var c=new RegExp("=","g")

    m=m.replace(c,"")

    m=u+m

    m=base64_decode(d)

  }

return m

}

你只需要在Python使用相应的库对抓取到的img-hash内容做解码即可得到图片地址。

你使用了str的find来从文本中定位位置,这样做太麻烦了,太多的代码细节,使用re模块做正则匹配就简单很多,更快的是直接使用现有的爬虫库.

使用re进行正则匹配,只需要使用正则式'<span class="img-hash">(.+?)<'即可提取出该页面中所有加密的图片地址。

import re

import base64

pat = re.compile('<span class="img-hash">(.+?)<')

...

def get_imgurls(url):

    urls = []

    for imgurl in pat.findall(url_open(url).decode('utf-8')):

        .append(str(base64.b64decode(imgurl), 'utf-8'))

    return urls

然后就可以对get_imgurls返回的列表遍历,逐个交给save_img处理了。

使用爬取库也只需要寻找span,从中找出class='img-hash'即可读取text。

从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁,自动索引,模拟程序或者蠕虫。