实战第二篇:爬取猫眼电影TOP100榜单所有信息
哈哈哈,同志们好久不见,今天来教大家如何爬取猫眼电影TOP100榜单的所有信息。猫眼电影这个网站可以说设计的非常规范,非常适合小白练手去获得自豪感。所以话不多说,我们开始介绍吧,走你~~~
目标:爬取猫眼电影TOP100榜单所有信息
1、分析站点,找规律
猫眼电影的网址为:http://maoyan.com/,但这不是我们此次想爬取的站点,我们爬取的站点是这个:http://maoyan.com/board/4(TOP100榜单)
接着看一下我们需要爬取的内容:
通过观察我们需要爬取的内容有:片名,图片,排名,主演,上映时间和评分这6部分。为防止出现因javascript脚本控制而导致源代码与我们实际看到的不一致这个问题的发送,我们直接在chrome的监听组件里面选择network,然后直接点击查看response,这样就能得到实际的代码(实际上这个榜单是静态加载的,源代码和实际代码是一样的,但是养成好习惯,在这里看就不怕javascript控制的问题了)
2.写代码,开始爬取网页
我们先确定一下影片的详细位置,这里你可以选择采用css选择器或是xpath选择器,但是为了和前面的正则表达式进行一个复习,我就使用正则表达式了。
通过观察,我们发现每一个电影都在一个<dd></dd>标签里面,所以我随便取出一个进行分析,然后根据正则表达式依次写出匹配规则:
```
<dd>.*?board-index.*?>(.*?)</i>.*?<.*?data-src="(.*?)".*?<p.*?name.*?a.*?>(.*?)</a>.*?<p.*?star.*?>(.*?)</p>.*?<p.*?releasetime.*?>(.*?)</p>.*?<p.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i></p>
```
完整的代码如下:
import requests
import re
import json
import time
# 获取单个页面
def get_one_page(url):
headers = {
"User-Agent": " Chrome/66.0.3359.139 Safari/537.36"
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
return None
# 解析单个页面
def parse_one_page(html):
pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?<.*?data-src="(.*?)".*?<p.*?name.*?a.*?>(.*?)</a>.*?<p.*?star.*?>'
'(.*?)</p>.*?<p.*?releasetime.*?>(.*?)</p>.*?<p.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i></p>'
, re.S) # re.S表示可以换行匹配
items = re.findall(pattern, html)
for item in items:
yield {
'排名': item[0],
'图片': item[1],
'片名': item[2].strip(),
'主演': item[3].strip()[3:] if len(item[3]) > 0 else '',
'上映时间': item[4].strip()[5:] if len(item[4]) > 0 else '',
'评分': item[5]+item[6].strip(),
}
# 注意一下,这里需要用yield,而不是return。yield函数返回的是一个生成器(一种特殊的迭代器,可以用for循环进行遍历)
# 如果用return,那么在第一轮循环结束就会跳出,只能获取到一部影片的信息
# 将信息进行写入
def write_to_file(content):
with open('maoyan.txt', 'a', encoding='utf-8')as f: # 采用append追加模式,字符集为utf8
f.write(json.dumps(content, ensure_ascii=False)+'\n') # 采用json的dumps方法来初始化字符串
# 注意一下,这里的ensure_ascii必须为False,因为son默认是以ASCII来解析code的,而中文不在ASCII编码当中,因此就禁止默认的ASCII生效,这也就是我们前面为啥自己定义字符集的原因
# 主方法
def main(offset):
url = "http://maoyan.com/board/4?offset="+str(offset)
html = get_one_page(url)
for item in parse_one_page(html):
write_to_file(item)
# 获取多个页面
if __name__ == '__main__':
for i in range(10):
main(offset=i*10)
time.sleep(1)
你别看上面的代码很多,这里其实就是构造了HTML下载器、HTML解析器和数据存储器这三个模块而已。采用模块化的思想,各个模块完成各自的任务,从而提高工作效率。当然为了提高爬取的效率,可以开启多进程的模式:
import requests
import re
import json
import time
from multiprocessing import Pool
# 获取单个页面
def get_one_page(url):
headers = {
"User-Agent": " Chrome/66.0.3359.139 Safari/537.36"
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
return None
# 解析单个页面
def parse_one_page(html):
pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?<.*?data-src="(.*?)".*?<p.*?name.*?a.*?>(.*?)</a>.*?<p.*?star.*?>'
'(.*?)</p>.*?<p.*?releasetime.*?>(.*?)</p>.*?<p.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i></p>'
, re.S) # re.S表示可以换行匹配
items = re.findall(pattern, html)
for item in items:
yield {
'排名': item[0],
'图片': item[1],
'片名': item[2].strip(),
'主演': item[3].strip()[3:] if len(item[3]) > 0 else '',
'上映时间': item[4].strip()[5:] if len(item[4]) > 0 else '',
'评分': item[5]+item[6].strip(),
}
# 注意一下,这里需要用yield,而不是return。yield函数返回的是一个生成器(一种特殊的迭代器,可以用for循环进行遍历)
# 如果用return,那么在第一轮循环结束就会跳出,只能获取到一部影片的信息
# 将信息进行写入
def write_to_file(content):
with open('maoyan.txt', 'a', encoding='utf-8')as f: # 采用append追加模式,字符集为utf8
f.write(json.dumps(content, ensure_ascii=False)+'\n') # 采用json的dumps方法来初始化字符串
# 注意一下,这里的ensure_ascii必须为False,因为son默认是以ASCII来解析code的,而中文不在ASCII编码当中,因此就禁止默认的ASCII生效,这也就是我们前面为啥自己定义字符集的原因
# 主方法
def main(offset):
url = "http://maoyan.com/board/4?offset="+str(offset)
html = get_one_page(url)
for item in parse_one_page(html):
write_to_file(item)
# 获取多个页面
if __name__ == '__main__':
p = Pool(4)
p.map(main, [i * 10 for i in range(10)])
time.sleep(1)
3、代码输出结果:
怎么样?是不是觉得自己很厉害!给自己鼓个掌先,撒个花先!
总结一下:
本例采用requests+ re的形式对猫眼电影TOP100榜单的所有信息进行了爬取,对于小白而言这是最容易懂的爬取例子。后面随着学习的不断深入,我们会挑战一些更有趣的,更难的例子。我们这里只爬取了TOP100榜单,那么小伙伴们还等什么,可以去爬取其他的4个榜单吧。
好了本篇关于爬取猫眼电影TOP100榜单的介绍就到此为止了,感谢你的赏阅!