requests库+正则表达式爬取猫眼电影

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


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


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


  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> 标签包围。

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


下面是解析网页的代码:


  1. def parse_one_page(html) -> list:

  2.    pattern = re.compile('<dd>.*?>(.*?)</i>.*?<img data-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 data-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

第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 data-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 文件保存,我们来看看结果:


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


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


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



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



转载于:https://juejin.im/post/5d414ec16fb9a06b122f19a6

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值