鱼C论坛

 找回密码
 立即注册
查看: 1814|回复: 8

[已解决]爬取百度贴吧某吧精品区图片遇到问题

[复制链接]
发表于 2021-3-9 00:18:25 | 显示全部楼层 |阅读模式
25鱼币
想爬取的网页:https://tieba.baidu.com/f?kw=%E5%89%83%E9%A1%BB%E7%84%B6%E5%90%8E%E6%8D%A1%E5%88%B0%E5%A5%B3%E9%AB%98%E4%B8%AD%E7%94%9F&ie=utf-8&tab=good
1用调试工具找到我要的图片
1.png
<img src="http://tiebapic.baidu.com/forum/wh%3D200%2C90%3B/sign=ad58eff4b7ec08fa26551ba569de1154/ab92f5f50ad162d9a888295706dfa9ec8b13cdb7.jpg" attr="97211" data-original="http://tiebapic.baidu.com/forum/wh%3D200%2C90%3B/sign=ad58eff4b7ec08fa26551ba569de1154/ab92f5f50ad162d9a888295706dfa9ec8b13cdb7.jpg" bpic="http://tiebapic.baidu.com/forum/w%3D580%3B/sign=974a0cf05010b912bfc1f6f6f3c6fd03/ac4bd11373f0820200f4da745cfbfbedab641b12.jpg" class="threadlist_pic j_m_pic " style="display: inline;">
标红的就是目标
然后写了一个正则去匹配,用一个网站测试
2.png 应该是没问题的
把body放进去也是没问题
3.png
最后爬到的东西不对
4.png
按理说应该有10个才对
而且爬取的图片也不对,爬到了
5.png
代码如下:
import re
import os
import urllib.request
import requests

url = input("请输入要爬取图片的帖子url:")
save_path = input("请输入要保存到的位置:")
os.getcwd()
if not os.path.exists(save_path):
    os.mkdir(save_path)
os.chdir(save_path)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
           'cookie': 'BIDUPSID=45588421F978DE2902A1A47464D72AB3; PSTM=1609986056; BAIDUID=45588421F978DE29E3D21BB7BB5A6873:FG=1; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; __yjs_duid=1_e3607a56e43709e2ca3db4147c46396a1612784778582; BAIDUID_BFESS=45588421F978DE29E3D21BB7BB5A6873:FG=1; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1614696427; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1614697139; __yjsv5_shitong=1.0_7_253e552513b2cf371866473b2e57fb4e5137_300_1614697145680_59.50.85.17_fe15699c; ab_sr=1.0.0_ZDRiZDU1NjAzNjRkMDUyOWE3ZTg3MWZlMjRhMGE4NzkwYmI3N2ExMzliMjY3MjIxOGIyY2EyMmMxNWQzOWFmY2UyZDZjMGFkYzVjNWZkNGQ1ZWIxMTJmYjZjM2Y0M2M2'
           }
req = requests.get(url=url, headers=headers).text
param = r'<img src="([^"]*\.jpg).*?>'
piclist = re.findall(param, req)
for each in piclist:
    img = requests.get(url=each, headers=headers).content
    file_name = each.split('/')[-1]
    print(file_name+"下载完毕!")
    with open(file_name, 'wb') as fp:
        fp.write(img)

求路过的大佬帮忙看看
最佳答案
2021-3-9 00:18:26
本帖最后由 suchocolate 于 2021-3-9 16:59 编辑

浏览器是经过渲染的,会有执行javascript或ajax等等,而urllib默认拿到的只是静态代码,不会渲染其中的内容,所以后有不同。
在html中,实际应该过滤bpic:
import requests
import re


def main():
    url = 'https://tieba.baidu.com/f?kw=%E5%89%83%E9%A1%BB%E7%84%B6%E5%90%8E%E6%8D%A1%E5%88%B0%E5%A5%B3%E9%AB%98%E4%B8%AD%E7%94%9F&ie=utf-8&tab=good'
    headers = {'user-agent': 'firefox'}
    r = requests.get(url, headers=headers)
    pics = re.findall(r'bpic="(.*?)"', r.text)
    print(pics)
    for item in pics:
        r = requests.get(item, headers=headers)
        pic_name = item.split('/')[-1]
        with open(pic_name, 'wb') as f:
            f.write(r.content)


if __name__ == '__main__':
    main()

最佳答案

查看完整内容

浏览器是经过渲染的,会有执行javascript或ajax等等,而urllib默认拿到的只是静态代码,不会渲染其中的内容,所以后有不同。 在html中,实际应该过滤bpic:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-9 00:18:26 | 显示全部楼层    本楼为最佳答案   
本帖最后由 suchocolate 于 2021-3-9 16:59 编辑

浏览器是经过渲染的,会有执行javascript或ajax等等,而urllib默认拿到的只是静态代码,不会渲染其中的内容,所以后有不同。
在html中,实际应该过滤bpic:
import requests
import re


def main():
    url = 'https://tieba.baidu.com/f?kw=%E5%89%83%E9%A1%BB%E7%84%B6%E5%90%8E%E6%8D%A1%E5%88%B0%E5%A5%B3%E9%AB%98%E4%B8%AD%E7%94%9F&ie=utf-8&tab=good'
    headers = {'user-agent': 'firefox'}
    r = requests.get(url, headers=headers)
    pics = re.findall(r'bpic="(.*?)"', r.text)
    print(pics)
    for item in pics:
        r = requests.get(item, headers=headers)
        pic_name = item.split('/')[-1]
        with open(pic_name, 'wb') as f:
            f.write(r.content)


if __name__ == '__main__':
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-9 00:20:12 | 显示全部楼层
本帖最后由 大马强 于 2021-3-9 00:28 编辑

测试正则网站
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-9 11:02:49 | 显示全部楼层
网站有反爬的(点检查,network,看看就知道了),需要Cookie,所以建议用session来爬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-9 16:01:39 | 显示全部楼层
刚学爬虫,啥都不懂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-9 17:06:03 | 显示全部楼层
suchocolate 发表于 2021-3-9 00:18
浏览器是经过渲染的,会有执行javascript或ajax等等,而urllib默认拿到的只是静态代码,不会渲染其中的内容 ...

谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-9 17:10:33 | 显示全部楼层
suchocolate 发表于 2021-3-9 00:18
浏览器是经过渲染的,会有执行javascript或ajax等等,而urllib默认拿到的只是静态代码,不会渲染其中的内容 ...

有点看不懂大佬你的正则表达式,能否解释下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-9 17:26:54 | 显示全部楼层
bpic="(.*?)"
1)以【bpic=】开头
2)内容外必须包含双引号【""】
3).*?:【.*】模糊匹配任何字符,加【?】就是非贪婪匹配,就是只匹配一个内容,否则【.*】会把双引号以及后续的其他字符也匹配中。
4)():匹配的内容作为一个组,这里利用组的特性,就是匹配组后,结果只显示组内的信息,组外的bpic=什么的信息就不显示了,省去处理显示的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-9 17:51:23 | 显示全部楼层
suchocolate 发表于 2021-3-9 17:26
bpic="(.*?)"
1)以【bpic=】开头
2)内容外必须包含双引号【""】

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 08:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表