大马强 发表于 2021-3-9 00:18: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用调试工具找到我要的图片

<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;">
标红的就是目标
然后写了一个正则去匹配,用一个网站测试
应该是没问题的
把body放进去也是没问题

最后爬到的东西不对

按理说应该有10个才对
而且爬取的图片也不对,爬到了

代码如下:
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)

求路过的大佬帮忙看看{:10_247:}

suchocolate 发表于 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()

大马强 发表于 2021-3-9 00:20:12

本帖最后由 大马强 于 2021-3-9 00:28 编辑

测试正则网站

笨鸟学飞 发表于 2021-3-9 11:02:49

网站有反爬的(点检查,network,看看就知道了),需要Cookie,所以建议用session来爬

大马强 发表于 2021-3-9 16:01:39

刚学爬虫,啥都不懂啊{:10_277:}

大马强 发表于 2021-3-9 17:06:03

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

谢谢大佬

大马强 发表于 2021-3-9 17:10:33

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

有点看不懂大佬你的正则表达式,能否解释下{:10_256:}

suchocolate 发表于 2021-3-9 17:26:54

bpic="(.*?)"
1)以【bpic=】开头
2)内容外必须包含双引号【""】
3).*?:【.*】模糊匹配任何字符,加【?】就是非贪婪匹配,就是只匹配一个内容,否则【.*】会把双引号以及后续的其他字符也匹配中。
4)():匹配的内容作为一个组,这里利用组的特性,就是匹配组后,结果只显示组内的信息,组外的bpic=什么的信息就不显示了,省去处理显示的问题。

大马强 发表于 2021-3-9 17:51:23

suchocolate 发表于 2021-3-9 17:26
bpic="(.*?)"
1)以【bpic=】开头
2)内容外必须包含双引号【""】


{:10_323:}
页: [1]
查看完整版本: 爬取百度贴吧某吧精品区图片遇到问题