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

2013-12-09 02:35:49 +08:00
 dizzy
我最近初学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

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

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

@dizzy 这个站的图片地址是相对路径,前面要加上 http://lumeizi.com/
vmebeh
2013-12-09 03:48:43 +08:00
@dizzy 用 () 包围需要提取内容的表达式
dizzy
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
2013-12-09 04:22:27 +08:00
Google beautifulsoup
dizzy
2013-12-09 04:23:52 +08:00
@Livid 这个我大概知道,我只是想在搞懂python基本库的情况下,再用第三方库。
jackjm
2013-12-09 08:26:01 +08:00
Python 3.3的话, 这里有一个不用第三方库的例子。

http://bamos.github.io/2013/05/03/scraping-tables-python/
dizzy
2013-12-09 08:56:26 +08:00
@jackjm 好的,谢谢你的提供,不过暂时还没有开始了解3。
Gawie
2013-12-09 08:59:20 +08:00
@Livid beautifulsoup 貌似解决编码问题很麻烦
hiwljun
2013-12-09 09:06:46 +08:00
@dizzy pyquery挺好用。
kevinkim
2013-12-09 09:11:32 +08:00
其实感觉用xpath更方便啊,直接开控制台右键复制xpath就能用。
roricon
2013-12-09 09:17:21 +08:00
@Gawie 解决编码的问题并不麻烦。只需要你弄清楚编码到底是什么。
wizardoz
2013-12-09 09:17:57 +08:00
html的话有一个库叫做“beautiful soap”,绝对好用。我原来就用这个来下载整站图片。
luoyou1014
2013-12-09 09:26:00 +08:00
BS4 强烈推荐, 抛弃正则表达式吧 http://www.crummy.com/software/BeautifulSoup/bs4/doc/
不过BS4解析dom的能力和js还是差了N个水准, 网页不标准的时候, 页面结构可能会乱掉, 所以最好贪婪匹配

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/92333

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX