php 正则表达式获取html标签内容_requests库+正则表达式爬取猫眼电影

f9388579a01cafd8eb1c45ae6cb6a9a4.png

我们用 requests 库 + 正则表达式构建一个简陋的爬虫,虽然这个爬虫很简陋,但是通过这个例子我们可以对爬虫有一个很好的了解。

这次目的是爬取猫眼电影 TOP 100,要想爬取这些信息,我们首先要到猫眼电影 TOP 100 的页面上观察一下(也可以说踩点)。网址为:https://maoyan.com/board/4

86fa7b1eb8747bc06404c0e34406e18c.png

这就是我们要爬取的页面,现在我们来写一段代码自动访问这个页面。

  1. def get_one_pages(url) -> 'HTML':
  2. headers = { # 构建表头,模仿正常浏览器,防止被屏蔽
  3. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'
  4. }
  5. response = requests.get(url, headers=headers)
  6. if response.status_code == 200: # 网页访问正常
  7. return response.text
  8. return None

我们构造了 get_one_pages(url) 函数,在构造这个函数时要注意一定要加上表头,表头的作用是让爬虫伪装成一个正常的浏览器请求。如果不加表头的话,会被服务器拒绝访问(不信你就试一下)。之后当你调用这个函数并往里面传入 URL 也就是https://maoyan.com/board/4 时,该函数会把这个网页的 HTML 返回下来。HTML 算是网页的源代码,在 Chrome 浏览器中按下 F12 键就能看到源代码,发现返回的 HTML 与网页中的 HTML 一样,那么证明我们这个网页算是访问成功了。

下一步我们要解析这个网页,获取我们想要的内容。观察返回的 HTML 会发现,每一个电影的相关信息被一个 <dd> </dd> 标签包围。

6038071e9e7e96ac1028822b9f2f37ef.png

以这段标签为例,我们需要获取的内容有排名、电影海报、电影名称、演员和上映时间。这时该轮到正则表达式出场了。我们用正则表达式去匹配这段文本,来获取想要的信息,如果你现在还不知道什么是正则表达式,可以 Google 一下,正则表达式的内容很复杂,但这里我们用到的很简单,一搜就会。

下面是解析网页的代码:

  1. def parse_one_page(html) -> list:
  2. pattern = re.compile('<dd>.*?>(.*?)</i>.*?<img src="(.*?)".*?title="(.*?)".*?<p class="star">(.*?)</p>.*?>(.*?)</p> ',
  3. re.S)
  4. res = re.findall(pattern, html)
  5. for i in res:
  6. yield { # 这里使用了生成器构造一个字典
  7. 'index': i[0],
  8. 'image': i[1],
  9. 'name': i[2].strip(),
  10. 'actor': i[3].strip(),
  11. 'time': i[4].strip(),
  12. }

我们用 <dd>.*?>(.*?)</i>.*?<img src="(.*?)".*?title="(.*?)".*?<p class="star">(.*?)</p>.*?>(.*?)</p> 这段正则表达式来匹配想要的内容,然后将匹配的结果存入一个字典中,为了以后方便读取和保存。

下一步我们把爬到的内容保存下来,否则一旦关闭程序,所有爬取的内容就会消失,白忙一顿岂不是很难受。

  1. def write_to_file(content):
  2. with open('result.txt', 'a', encoding='utf-8') as f:
  3. f.write(json.dumps(content, ensure_ascii=False) + 'n')

我们用上下文管理器打开一个 txt 文件,将爬下来的内容写入这个文件中。

我们的目标是爬取猫眼电影 TOP 100,可是现在才爬到 TOP 10,那后面的怎么办呢?再来观察网页,我们看到,第11-20的URL为:https://maoyan.com/board/4?offset=10

37babae8d72188b8b9bd62334e179cc9.png

第21-30的URL为:https://maoyan.com/board/4?offset=20 ,以此类推。。。

那么我们可以推断出来网页的变化只跟 offset= 后面数字有关,这样可以继续写代码了。

  1. def main(offset):
  2. url = 'http://maoyan.com/board/4?offset=' + str(offset)
  3. html = get_one_pages(url)
  4. content = parse_one_page(html)
  5. for i in content:
  6. print(i)
  7. write_to_file(i)

这里写了一个 main(offset) 函数,传入相应的数字,会对相应的网页进行我们之前的操作。

最后一步,传入数字即可。总结一下最终的代码:

  1. import requests
  2. import re
  3. import json
  4. def get_one_pages(url) -> 'HTML':
  5. headers = { # 构建表头,模仿正常浏览器,防止被屏蔽
  6. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'
  7. }
  8. response = requests.get(url, headers=headers)
  9. if response.status_code == 200: # 网页访问正常
  10. return response.text
  11. return None
  12. def parse_one_page(html) -> list:
  13. pattern = re.compile('<dd>.*?>(.*?)</i>.*?<img src="(.*?)".*?title="(.*?)".*?<p class="star">(.*?)</p>.*?>(.*?)</p> ',
  14. re.S)
  15. res = re.findall(pattern, html)
  16. for i in res:
  17. yield { # 这里使用了生成器构造一个字典
  18. 'index': i[0],
  19. 'image': i[1],
  20. 'name': i[2].strip(),
  21. 'actor': i[3].strip(),
  22. 'time': i[4].strip(),
  23. }
  24. def write_to_file(content):
  25. with open('result.txt', 'a', encoding='utf-8') as f:
  26. f.write(json.dumps(content, ensure_ascii=False) + 'n')
  27. def main(offset):
  28. url = 'http://maoyan.com/board/4?offset=' + str(offset)
  29. html = get_one_pages(url)
  30. content = parse_one_page(html)
  31. for i in content:
  32. print(i)
  33. write_to_file(i)
  34. for i in range(10):
  35. main(i*10)

这样就可以将猫眼电影 TOP 100 爬取下来,并作为一个 txt 文件保存,我们来看看结果:

364ac7af05641f07e961b64de0bad992.png

很不错,就是我们期待的结果。

通过这么一个简陋的爬虫程序,我们对爬虫已经有了一个大致的了解,如果想要爬取到更多有用的内容,仅仅这样还是远远不够的,希望你能在爬虫路上越爬越远。

以上内容素材来源于 崔庆才《Python 3网络爬虫开发实战》。

ps.如果想要打开新世界的大门,可以扫描下方的二维码,关注微信公众号「SuperFeng」。

2110ae649ce123294dd3ad0ed7577031.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值