爬取百度贴吧某吧精品区图片遇到问题
想爬取的网页: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=good1用调试工具找到我要的图片
<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 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:28 编辑
测试正则网站 网站有反爬的(点检查,network,看看就知道了),需要Cookie,所以建议用session来爬 刚学爬虫,啥都不懂啊{:10_277:} suchocolate 发表于 2021-3-9 00:18
浏览器是经过渲染的,会有执行javascript或ajax等等,而urllib默认拿到的只是静态代码,不会渲染其中的内容 ...
谢谢大佬 suchocolate 发表于 2021-3-9 00:18
浏览器是经过渲染的,会有执行javascript或ajax等等,而urllib默认拿到的只是静态代码,不会渲染其中的内容 ...
有点看不懂大佬你的正则表达式,能否解释下{:10_256:} bpic="(.*?)"
1)以【bpic=】开头
2)内容外必须包含双引号【""】
3).*?:【.*】模糊匹配任何字符,加【?】就是非贪婪匹配,就是只匹配一个内容,否则【.*】会把双引号以及后续的其他字符也匹配中。
4)():匹配的内容作为一个组,这里利用组的特性,就是匹配组后,结果只显示组内的信息,组外的bpic=什么的信息就不显示了,省去处理显示的问题。 suchocolate 发表于 2021-3-9 17:26
bpic="(.*?)"
1)以【bpic=】开头
2)内容外必须包含双引号【""】
{:10_323:}
页:
[1]