问大家一个python写网络爬虫程序的问题。 - V2EX
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 7398 次点击
    这是一个创建于 4325 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我最近初学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
    PRO
       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     Solana     1365 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 16:43 PVG 00:43 LAX 09:43 JFK 12:43
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86