我又来水篇文章啦。。。

看完大眼仔,闲的无聊就顺手爬了一下这个网站top60的排行榜单。

先看一下top60的页面
爬取91美剧网top60榜单 - 图1
我这就只为了取top排名和美剧名称,所以这里只是简单的用requests和正则爬下来了。
代码如下:

  1. # 91美剧网,美剧排行榜前60名
  2. import requests
  3. import re
  4. url = "https://91mjw.com/alltop_hit"
  5. def get_html(url):
  6. req = requests.get(url).content.decode('utf-8')
  7. return req
  8. tops = re.findall(r'<span>Top (\d*)</span></div><div class="zhuangtai"><span></span></div></div>',str(get_html(url)))
  9. movie_names = re.findall(r'<h2>(.*?)</h2></a></article>',str(get_html(url)))
  10. # 电影名称这里注意,使用".*"贪婪匹配时,把那一段都匹配了,但是".*?"非贪婪匹配时就正常了
  11. # str_top = "".join(top)
  12. # str_movie_name = "".join(movie_name)
  13. # 这里是讲正则匹配出的内容字符串化,list->str,但是这里不需要了。。。。
  14. for top,movie_name in zip(tops,movie_names):
  15. print("top {0} -> {1}".format(top,movie_name))
  16. #这里开始没弄明白的循环输出,其实只要压包(zip)一下就好了。将两个列表合并起来。

效果如下:
爬取91美剧网top60榜单 - 图2
这里只是简单的根据正则匹配了一下,本文主要是说说代码中那三部分注释所学到的东西
1.贪婪匹配与非贪婪匹配:

  • 贪婪匹配:在正则匹配成功的情况下,尽量多的匹配数据。
  • 非贪婪匹配:在正则匹配成功的情况下,尽量少的匹配数据。

我们举个例子理解一下:
爬取91美剧网top60榜单 - 图3
先看result1,我们想要匹配data内容中的数字部分,所以我们用“\d+”来匹配1个或多个数字,但是我们又不想要数字两边的“llo ”和“ wor”这种杂乱的数据,所以我们用“. ”去匹配任意字符。
但是看result1的输出,正则只匹配出了一个数字“5”。
这是因为“. ”是贪婪匹配,贪婪匹配的特性就是尽可能多的匹配数据,所以根据正则的流程,result1中的第一个“. ”匹配了“llo 1234”这些数据,只留了一个“5”给“\d+”去满足匹配。而后面的“ wor”本身就不属于数字,自然交给第二个“.
”匹配掉了。
再来看看result2,同样正则是取数字部分,但是由于第一个“. ?”是非贪婪,非贪婪匹配的特性就是尽可能少的匹配数据,所以result2中为了满足“\d+”取数字部分的正则,第一个“. ?”就只取了“llo ”,并将全部的数字“12345”留给了“\d+”。
所以在写正则时尽可能将杂乱数据用非贪婪匹配“.* ?”防止数据丢失。
2.正则匹配结果list转化为str:
爬取91美剧网top60榜单 - 图4
当一个正则匹配出结果的时候,可以看到输出为一个列表的形式,但是有时候,我们需要输出的是一个字符串,这时候我们可以使用join()方法将list转为字符串。

  • str.join(sequence):该方法将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串。sequence表示要连接的序列,前面的str表示分隔符()
    举个例子:
    爬取91美剧网top60榜单 - 图5

3.合并两个列表:
当我用正则匹配出两个列表的时候,我想将其组合起来输出,开始我使用循环的方式输出,但是后来觉得不太好看,而且复杂。翻了翻发现还有个zip函数。。。。原谅我之前没注意到。

  • zip():该函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。后续可以使用 list() 转换来输出列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
    一长串的看的也不是很明白,举个例子:
    爬取91美剧网top60榜单 - 图6

简单来说就是讲两个列表中的值一一对应起来组合成一个新的元组,且元素数量按最低的列表来(类似短板效应)。
溜了溜了,睡觉了。