lzb1001 发表于 2022-5-2 21:52:40

关于爬取网页贴吧的图

>>> import urllib.request
>>> import re
>>> response = urllib.request.urlopen('https://tieba.baidu.com/p/1397681324')
>>> html = response.read().decode('utf-8')
>>> p = r'<img class="BDE_Image".*?src="([^"]*\.jpg)[^"]*".*?>'
>>> imglist = re.findall(p,html)
>>> for each in imglist:
        print(each)

       
https://imgsa.baidu.com/forum/w%3D580/sign=3c06220887d6277fe912323018391f63/d4ecea1f3a292df55bf91aa6bc315c6034a87349.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=c35a268c4bfbfbeddc59367748f1f78e/4cf62badcbef7609d2c32e2c2edda3cc7dd99ebf.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=e92e32b633fa828bd1239debcd1e41cd/d18dbaec08fa513d7387da6d3d6d55fbb2fbd952.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=e70575b5afc379317d688621dbc5b784/6edfb9cc7cd98d109e1cbb82213fb80e7aec90bf.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=d3525bb0c895d143da76e42b43f18296/4cd58b2397dda1443cc1db01b2b7d0a20df486bf.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=0e36fbb20a55b3199cf9827d73a88286/3cdb971001e9390180ca3a8d7bec54e737d196bf.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=3208d0e5d0160924dc25a213e406359b/7af12087e950352a42a992bb5343fbf2b3118bbf.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=1b2ee48ac93d70cf4cfaaa05c8ddd1ba/d0508222720e0cf3b3daf8480a46f21fbe09aa52.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=a60fc2b7970a304e5222a0f2e1c9a7c3/7d6f4ffbb2fb43163632ccc920a4462309f7d352.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=a90b8d771bd5ad6eaaf964e2b1ca39a3/7499193b5bb5c9ea6edeb550d539b6003af3b352.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=d31a9a5bbc3eb13544c7b7b3961fa8cb/22d2ed03918fa0ec5bead2be269759ee3d6ddb52.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=fc80da6d3d6d55fbc5c6762e5d234f40/bd1d5b34970a304eff081649d1c8a786c9175c59.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=b8d1da01b2b7d0a27bc90495fbee760d/33f298025aafa40f5e1e786eab64034f79f019ae.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=ff80693c6c81800a6ee58906813433d6/e9ee9013632762d0d9db340ca0ec08fa503dc69a.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=9f063901d158ccbf1bbcb53229d9bcd4/172e0bdfa9ec8a134fffc753f703918fa1ecc09a.jpg
https://imgsa.baidu.com/forum/w%3D580/sign=b15a74dbccbf6c81f7372ce08c3fb1d7/51ddb3ec8a1363274f085280918fa0ec09fac79a.jpg



【我的问题】

1、以上是返回的结果,数了一下共16张图,而实际上https://tieba.baidu.com/p/1397681324页面中分2页,仅第1页就不止16张图,而我想把2页所有的图片都爬取

2、r'<img class="BDE_Image".*?src="([^"]*\.jpg)[^"]*".*?>'有点看不懂呢,请大神指点下

ba21 发表于 2022-5-2 22:05:59

去搜下 python爬取动态页面

Twilight6 发表于 2022-5-3 10:08:53


1、以上是返回的结果,数了一下共16张图,而实际上https://tieba.baidu.com/p/1397681324页面中分2页,仅第1页就不止16张图,而我想把2页所有的图片都爬取

第一页就 16 张图,这里你的标签获取的图片都是指的是用户上传的图片,不能把广告图片、表情图片算进去

想爬第二页,最简单的就是观察 url 变化,发现 url:

https://tieba.baidu.com/p/1397681324?pn=1

https://tieba.baidu.com/p/1397681324?pn=2

https://tieba.baidu.com/p/1397681324?pn=3

https://tieba.baidu.com/p/1397681324?pn=4

共四页,你只需要一个 for 循环 1~5 格式化到 url 最后就行了

r'<img class="BDE_Image".*?src="([^"]*\.jpg)[^"]*".*?>'有点看不懂呢,请大神指点下

<img class="BDE_Image".*?src="([^"]*\.jpg)[^"]*".*?> 红色部分都是原字符串,观察 html 标签发现的共同点,所以直接写死这些字符,其他的都是正则匹配符了

lzb1001 发表于 2022-5-3 10:54:39

本帖最后由 lzb1001 于 2022-5-3 11:01 编辑

Twilight6 发表于 2022-5-3 10:08
第一页就 16 张图,这里你的标签获取的图片都是指的是用户上传的图片,不能把广告图片、表情图片算进 ...

感谢大神指点

1、该贴吧有2页,我算了下,光第1页就至少有40张美女图片啊,为什么只爬取到16张图呢?

2、正则表达式是否可以写成:r'<img class="BDE_Image" src=".*?\.jpg".*?>'

Twilight6 发表于 2022-5-3 10:59:11

lzb1001 发表于 2022-5-3 10:54
感谢大神指点

该贴吧有2页,我算了下,光第1页就至少有40张美女图片啊,为什么只爬取到16张图呢?


知道为什么了,刚刚试着登入了,发现贴吧登入后用户一页可以查看 30 多楼层

而未登入时,只能查看 15 左右的楼层,才导致图片显示数量的不同

而爬虫你没有设置 cookie ,就默认是没有登入的

所以我没登入看到的总页码是 4 页,登入后看到的是 2 页

lzb1001 发表于 2022-5-3 11:04:42

Twilight6 发表于 2022-5-3 10:59
知道为什么了,刚刚试着登入了,发现贴吧登入后用户一页可以查看 30 多楼层

而未登入时,只能查看 ...

1、哦,原来如此,我都没注意登陆问题呢。那是不是说登陆后只要爬取2页,未登陆需要爬取4页,当然只要 通过设置for循环。无论哪种情况,所有美女图片都会一张不落(广告图或gif除外),是这样吗?

2、正则表达式是否可以写成:r'<img class="BDE_Image" src=".*?\.jpg".*?>'

Twilight6 发表于 2022-5-3 11:11:03

lzb1001 发表于 2022-5-3 11:04
1、哦,原来如此,我都没注意登陆问题呢。那是不是说登陆后只要爬取2页,未登陆需要爬取4页,当然只要...


1、那是不是说登陆后只要爬取2页,未登陆需要爬取4页,当然只要 通过设置for循环。无论哪种情况,所有美女图片都会一张不落(广告图或gif除外),是这样吗?

嗯,是否有其余图片要看你正则会不会匹配其余没用的资源

2、正则表达式是否可以写成:r'<img class="BDE_Image" src=".*?\.jpg".*?>'

括号不能少,我们主要是为了匹配出图片的资源地址,即 url ,这里的括号补上后就是匹配到后留下的部分

r'<img class="BDE_Image" src="(.*?\.jpg)".*?>'

lzb1001 发表于 2022-5-3 21:27:49

Twilight6 发表于 2022-5-3 10:08
第一页就 16 张图,这里你的标签获取的图片都是指的是用户上传的图片,不能把广告图片、表情图片算进 ...

假设要任意输入百度贴吧地址,并不知道准确页数的话,应如何处理呢?主要从需求角度方便爬取用户,他无需先访问地址查询下页数

Twilight6 发表于 2022-5-3 22:09:27

lzb1001 发表于 2022-5-3 21:27
假设要任意输入百度贴吧地址,并不知道准确页数的话,应如何处理呢?主要从需求角度方便爬取用户,他无需 ...



观察网站,一般都会显示最后一页的页码,所以我们目标就是找到这个页码值,同样可以用正则匹配

页: [1]
查看完整版本: 关于爬取网页贴吧的图