V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
dizzy
V2EX  ›  Python

问大家一个python写网络爬虫程序的问题。

  •  
  •   dizzy · 2013-12-09 02:35:49 +08:00 · 6723 次点击
    这是一个创建于 3763 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我最近初学python和正则表达式,想写一个简单的爬图片的网络爬虫程序。但是现在卡在怎么分析图片地址上面。具体我有以下两个问题,想请教下大家:
    1、比如http://lumeizhi.com这个网站,我用chrome浏览,按f12,怎么快速准确找到图片地址?
    2、怎样写相应的正则表达式呢?
    我写的代码是这样的:
    import urllib2
    import urllib
    import re

    pat = re.compile('')
    html = urllib2.urlopen('http://lumeizhi.com').read()
    imglist = pat.findall(html)
    i = 1
    for x in imglist:
    urllib.urlretrieve(x,'D:\pic\%s.jpg' % i)
    i = i + 1

    但是我现在不知道该怎么写这个正则表达式了。
    41 条回复    1970-01-01 08:00:00 +08:00
    KK233
        1
    KK233  
       2013-12-09 03:07:30 +08:00   ❤️ 1
    我也是新手~
    1.源代码页面下ctrl+F搜索 关键字'jpg',高亮的都是图片地址
    2.观察发现图片地址的格式是<img src="xxxx" />,图片地址是xxxx.然后用懒惰匹配取url就可以了.注意这里是相对地址.前面得加上应该加的东西..
    至于正则学习推荐 https://deerchao.net/tutorials/regex/regex.htm 正则表达式30分钟入门,看完应该就会写啦~
    dizzy
        2
    dizzy  
    OP
       2013-12-09 03:13:09 +08:00
    @KK233 谢谢你的答复,你提到那篇教程我之前初略看了下,看来还得细看下啊。至于你提到的第二点还是有些不明白,匹配的时候<img src=这个也要匹配吗?
    vmebeh
        3
    vmebeh  
       2013-12-09 03:18:58 +08:00   ❤️ 2
    pat = re.compile(ur'<img\ssrc="(.+?)"\s/>')

    python自带有个正则表达式测试工具,在 Tools\Scripts\redemo.py,表达式在其他地方写好了再复制过来,不然不小心匹配到的内容多会卡死
    KK233
        4
    KK233  
       2013-12-09 03:27:19 +08:00   ❤️ 1
    @dizzy "<img src="是"图片地址"的一个特征, 加上这个特征可以匹配你想匹配的img类型的图,
    比如:
    <img src="1.jpg" />
    <img src="2.jpg" />
    <img src="3.jpg" />
    <script src="4.js"> 使用正则 (<img src=".*?") 抓取到的都是你想要抓取的东西,但是 4.js 就不是你想要的,如果你不用你仅仅用(src=".*?") 不加图片特征 img, 是不是连4.js都会匹配到?
    KK233
        5
    KK233  
       2013-12-09 03:28:34 +08:00   ❤️ 1
    @vmebeh 我也有一个问题,就是有的时候空白字符用'\s'读不出来,这是啥问题?
    dizzy
        6
    dizzy  
    OP
       2013-12-09 03:33:50 +08:00
    @vmebeh 用你的表达式倒是匹配到了地址,但是带到我的代码里面却还是不能下载,不知道怎么回事。
    dizzy
        7
    dizzy  
    OP
       2013-12-09 03:43:17 +08:00
    @KK233 我用'<img src=".*?"'这样的正则表达式又试了下煎蛋网,过滤出了'<img src="http://ww4.sinaimg.cn/xxxxxxxxxxx.jpg"'这样的地址,但是这个图片地址前面有<img src字样,我怎么才能下载呢?
    vmebeh
        8
    vmebeh  
       2013-12-09 03:45:53 +08:00   ❤️ 1
    @KK233 似乎与编码有关? http://docs.python.org/2/library/re.html#regular-expression-syntax

    @dizzy 这个站的图片地址是相对路径,前面要加上 http://lumeizi.com/
    vmebeh
        9
    vmebeh  
       2013-12-09 03:48:43 +08:00   ❤️ 1
    @dizzy 用 () 包围需要提取内容的表达式
    dizzy
        10
    dizzy  
    OP
       2013-12-09 04:10:49 +08:00
    @KK233
    @vmebeh 代码终于可以运行了。非常感谢你们。我的正则表达式基础还需加强啊。不知道你们的正则表达式在哪学的。只需要看看这个吗?https://deerchao.net/tutorials/regex/regex.htm
    最后我的代码是这样写的:
    import urllib2
    import urllib
    import re

    pat = re.compile('<img src="(.*?)"')
    html = urllib2.urlopen('http://lumeizhi.com').read()
    imglist = pat.findall(html)
    i = 1
    for x in imglist:
    url = 'http://lumeizhi.com' + x
    urllib.urlretrieve(url, 'D:\pic\%s.jpg' % i)
    i = i + 1
    Livid
        11
    Livid  
    MOD
       2013-12-09 04:22:27 +08:00 via iPhone   ❤️ 1
    Google beautifulsoup
    dizzy
        12
    dizzy  
    OP
       2013-12-09 04:23:52 +08:00
    @Livid 这个我大概知道,我只是想在搞懂python基本库的情况下,再用第三方库。
    jackjm
        13
    jackjm  
       2013-12-09 08:26:01 +08:00 via iPad   ❤️ 1
    Python 3.3的话, 这里有一个不用第三方库的例子。

    http://bamos.github.io/2013/05/03/scraping-tables-python/
    dizzy
        14
    dizzy  
    OP
       2013-12-09 08:56:26 +08:00
    @jackjm 好的,谢谢你的提供,不过暂时还没有开始了解3。
    Gawie
        15
    Gawie  
       2013-12-09 08:59:20 +08:00   ❤️ 1
    @Livid beautifulsoup 貌似解决编码问题很麻烦
    hiwljun
        16
    hiwljun  
       2013-12-09 09:06:46 +08:00   ❤️ 1
    @dizzy pyquery挺好用。
    kevinkim
        17
    kevinkim  
       2013-12-09 09:11:32 +08:00   ❤️ 1
    其实感觉用xpath更方便啊,直接开控制台右键复制xpath就能用。
    roricon
        18
    roricon  
       2013-12-09 09:17:21 +08:00   ❤️ 1
    @Gawie 解决编码的问题并不麻烦。只需要你弄清楚编码到底是什么。
    wizardoz
        19
    wizardoz  
       2013-12-09 09:17:57 +08:00   ❤️ 1
    html的话有一个库叫做“beautiful soap”,绝对好用。我原来就用这个来下载整站图片。
    luoyou1014
        20
    luoyou1014  
       2013-12-09 09:26:00 +08:00   ❤️ 1
    BS4 强烈推荐, 抛弃正则表达式吧 http://www.crummy.com/software/BeautifulSoup/bs4/doc/
    不过BS4解析dom的能力和js还是差了N个水准, 网页不标准的时候, 页面结构可能会乱掉, 所以最好贪婪匹配
    Lelouchcr
        21
    Lelouchcr  
       2013-12-09 09:26:35 +08:00   ❤️ 1
    @dizzy 当时看了这个google的教程,然后写了个爬豆瓣相册的爬虫
    https://developers.google.com/edu/python/?hl=zh-CN
    alexrezit
        22
    alexrezit  
       2013-12-09 09:30:29 +08:00   ❤️ 1
    正则? 解析 HTML 难道不是应该用 XPath?
    dizzy
        23
    dizzy  
    OP
       2013-12-09 09:34:33 +08:00
    @hiwljun
    @kevinkim
    @wizardoz
    @luoyou1014 谢谢推荐,我准备尽快熟悉下beautiful soup和pyquery。
    dizzy
        24
    dizzy  
    OP
       2013-12-09 09:36:28 +08:00
    @Lelouchcr 谢谢,又找到个资料,这个是google的python课?英语暂时比较捉急。
    dizzy
        25
    dizzy  
    OP
       2013-12-09 09:37:03 +08:00
    @alexrezit 现在大家写网络爬虫都不用正则了吗?
    alexrezit
        26
    alexrezit  
       2013-12-09 09:46:14 +08:00
    @dizzy
    疯了?
    Lelouchcr
        27
    Lelouchcr  
       2013-12-09 09:52:28 +08:00
    @dizzy 对的,完全满足你的要求,全用python的基本库,虽然是e文,还有配套练习,还有python的话总要面对E文的,面对现实吧~~
    Sylv
        28
    Sylv  
       2013-12-09 10:06:17 +08:00   ❤️ 1
    dizzy
        29
    dizzy  
    OP
       2013-12-09 10:12:39 +08:00
    @Lelouchcr 哎,我也不是说全得用基本库吧,就是先想用基本库做做,然后再用第三方。都得熟悉熟悉嘛。
    dizzy
        30
    dizzy  
    OP
       2013-12-09 10:13:04 +08:00
    @alexrezit 额。。。只是试试。
    dizzy
        31
    dizzy  
    OP
       2013-12-09 10:13:35 +08:00
    @Sylv 请问下这个是怎么做出来的?
    Sylv
        32
    Sylv  
       2013-12-09 10:35:26 +08:00   ❤️ 1
    @dizzy 你写的代码只能抓取首页的几张图片,对“加载更多”就没辙了,对吧?
    我看了下这个网站的js代码,发现它是用/image.json来载入图片的
    这样就不用去分析网页代码了,甚至还能知道图片得了多少个赞哦
    然后用json.loads(),很容易就可以得到地址进行整站下载了
    yueye
        33
    yueye  
       2013-12-09 10:39:08 +08:00
    @Sylv 解决的方法好优雅
    dizzy
        34
    dizzy  
    OP
       2013-12-09 11:22:16 +08:00
    @Sylv 刚刚去看了下python json模块的解释,虽然还是不懂你是怎么做到的,但是感觉这个办法挺简单的(我之前确实不能处理加载更多的情况)。可能是我对javascript不了解的原因吧。
    fengliu222
        35
    fengliu222  
       2013-12-09 11:45:45 +08:00
    node.js+cheerio比较简单~
    detailyang
        36
    detailyang  
       2013-12-09 11:50:12 +08:00
    js代码吊炸天 return console.log('找工作?山东济南找蓝翔!');
    Sylv
        37
    Sylv  
       2013-12-09 12:51:12 +08:00
    @dizzy 不是我做到的。是这个网站本来就提供了json数据来载入图片 我只是把它找了出来 然后可以通过json模块来处理json数据以获取图片地址

    @detailyang 我当时也笑了
    0bit
        38
    0bit  
       2013-12-10 17:45:16 +08:00
    @wizardoz 我在找Python上好用的SOAP Client的时候竟然搜到了这里。是"Beautiful Soup",不是"Beautiful Soap"
    qu2ena
        39
    qu2ena  
       2013-12-15 03:19:06 +08:00
    哇哇哇,我也是爬虫新手,我超级爱爱爱dizzy那首歌。
    qu2ena
        40
    qu2ena  
       2013-12-15 03:24:57 +08:00
    @Sylv 你这个方法好有意思哇。。
    dizzy
        41
    dizzy  
    OP
       2013-12-17 10:37:13 +08:00
    @qu2ena 貌似你也是才学python?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1053 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:10 · PVG 03:10 · LAX 12:10 · JFK 15:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.