ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python:网络爬虫之正则获取电影名称和封面

2021-05-16 12:01:42  阅读:200  来源: 互联网

标签:ratio python photo 电影 爬虫 jpg 正则 https com


 

利用正则表达式查找电影名称和电影封面

示例代码显示如下:


import re
import ssl
import urllib.request
from bs4 import BeautifulSoup

url = "https://movie.douban.com/chart"
headers = {"user-agent":
               "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"
           }
ssl._create_default_https_context = ssl._create_unverified_context
url_obj = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(url_obj)
html = response.read().decode('utf8')
bs = BeautifulSoup(html, "html.parser")
data = bs.find_all("img", {"src": re.compile("https:\/\/(.+?)\.jpg")})
for i in data:
    print(i)
  • 使用用find_all()查找img标签且属性为src的数据

  • re.compile函数是编译正则表达式

  • \ 是转译符,把特殊含义的字符转成字面形式

  • () 是表达式编组,优先运行小括号的匹配

  • . 是任意匹配单个字符(包括符号、数字和空格等)

  • + 是匹配前面的字符,子表达式或者括号里的字符至少匹配一次

  • ? 是对它前面的正则式匹配0到1次重复。ab? 会匹配 'a' 或者 'ab'

正则表达式官方文档地址显示如下:

https://docs.python.org/zh-cn/3/library/re.html

运行后的结果显示如下:

<img alt="鬼灭之刃 剧场版 无限列车篇" class="" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2623798236.jpg" width="75"/>
<img alt="酒精计划" class="" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2628440526.jpg" width="75"/>
<img alt="地球改变之年" class="" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2638827823.jpg" width="75"/>
<img alt="小人物" class="" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2633966702.jpg" width="75"/>
<img alt="无依之地" class="" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2630453887.jpg" width="75"/>
<img alt="智能大反攻" class="" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2637896820.jpg" width="75"/>
<img alt="扎克·施奈德版正义联盟" class="" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2634360594.jpg" width="75"/>
<img alt="真人快打" class="" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2639148697.jpg" width="75"/>
<img alt="新神榜:哪吒重生" class="" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2631711326.jpg" width="75"/>
<img alt="徐福" class="" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2625736779.jpg" width="75"/>
<img class="m_sub_img" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p485887754.jpg"/>
<img class="m_sub_img" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p1675053073.jpg"/>
<img class="m_sub_img" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p1374786017.jpg"/>
<img class="m_sub_img" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2249048907.jpg"/>

但是只想要含有alt和src属性并且拿到alt和src属性的数据

示例代码显示如下:

data = bs.find_all("img", {"src": re.compile("https:\/\/(.+?)\.jpg")})
for i in data:
    print('电影名称:', i.attrs['alt'], ' || ', '电影图片:', i.attrs['src'])
  • i.attrs是获取全部属性

  • i.attrs['src'] 获取属性的值,和字典取值一样(因为i.attrs返回的就是一个字典对象)

 

运行后的显示结果如下:


Traceback (most recent call last):
  File "/Users/lifeng/python-projects/Test/pythonReptile/beautifulExample/run_beautiful_soup.py", line 29, in <module>
    print('电影名称:', i.attrs['alt'], ' || ', '电影封面:', i.attrs['src'])
KeyError: 'alt'
电影名称:鬼灭之刃 剧场版 无限列车篇  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2623798236.jpg
电影名称:酒精计划  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2628440526.jpg
电影名称:地球改变之年  ||  电影封面:https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2638827823.jpg
电影名称:小人物  ||  电影封面:https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2633966702.jpg
电影名称:无依之地  ||  电影封面:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2630453887.jpg
电影名称:智能大反攻  ||  电影封面:https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2637896820.jpg
电影名称:扎克·施奈德版正义联盟  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2634360594.jpg
电影名称:真人快打  ||  电影封面:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2639148697.jpg
电影名称:新神榜:哪吒重生  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2631711326.jpg
电影名称:徐福  ||  电影封面:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2625736779.jpg

alt和src属性的数据是拿到了,但是又抛出了KeyError错误,主要是因为img标签中有一部分是没有alt属性的,在字典取值时没取到,就进行了抛错误

示例代码显示如下:


data = bs.find_all("img", {"src": re.compile("https:\/\/(.+?)\.jpg")})
for i in data:
    try:
        print('电影名称:', i.attrs['alt'], ' || ', '电影图片:', i.attrs['src'])
    except KeyError as e:
        pass

使用try...except进行异常捕获,抛keyError就pass掉

运行后的结果显示如下:

电影名称:鬼灭之刃 剧场版 无限列车篇  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2623798236.jpg
电影名称:酒精计划  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2628440526.jpg
电影名称:地球改变之年  ||  电影封面:https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2638827823.jpg
电影名称:小人物  ||  电影封面:https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2633966702.jpg
电影名称:无依之地  ||  电影封面:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2630453887.jpg
电影名称:智能大反攻  ||  电影封面:https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2637896820.jpg
电影名称:扎克·施奈德版正义联盟  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2634360594.jpg
电影名称:真人快打  ||  电影封面:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2639148697.jpg
电影名称:新神榜:哪吒重生  ||  电影封面:https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2631711326.jpg
电影名称:徐福  ||  电影封面:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2625736779.jpg

 

以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,评论区留言会及时修正发布,谢谢!

未完,待续…

一直都在努力,希望您也是

 

微信搜索公众号:就用python

 

 

 

 

 

 

标签:ratio,python,photo,电影,爬虫,jpg,正则,https,com
来源: https://blog.csdn.net/LIFENG0402/article/details/116886985

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有