Python爬虫-猫眼电影排行

爬虫的目标

爬取猫眼电影TOP100的电影名称,时间,评分,图片等信息

猫眼TOP100网站:http://maoyan.com/board/4




抓取分析

Python爬虫-猫眼电影排行_第1张图片

查看网页源代码,找到对应的目标信息,发现一部电影对应的源代码是一个dd节点
Python爬虫-猫眼电影排行_第2张图片




抓取首页

为了方便,这里先抓取第一页的内容,运行之后,可以查看到网页的源代码,之后需要对页面进行解析。

import requests
def get_one_page(url):
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'  
    }  #头信息,爬取一些网站时需要加上,否则可能会爬取失败
    response = requests.get(url,headers=headers)
    if (response.status_code==200):
        return response.text  #返回网页内容
    return None

def main():
    url = 'http://www.maoyan.com/board/4'
    html = get_one_page(url)
    print(html)
main()




正则匹配

正则表达式匹配对应的电影排名,图片,名称,内容,主演,发布时间,评分等7个内容
首先先看看正则匹配电影排名:
.?board-index.?>(.*?)
(.*?)是方便可以用group()得到所要的结果
下面贴出爬取以上7种的正则表达式(较复杂,在后续的文章中会改进,这里只做简单使用)
.?board-index.?>(.?).?data-src="(.?)".?name.?a.?>(.?).?star.?>(.?)

.?releasetime.?>(.?)

.
?integer.?>(.?).?fraction.?>(.?).?

通过调用findall()方法提取所有内容,接下来,我们定义一个解析页面的方法parse_one_page(),代码如下

def parse_one_page(html):
    pattern = re.compile('
.*?board-index.*?>(.*?).*?data-src="(.*?)".*?name.*?a.*?>(.*?).*?star.*?>(.*?)

.*?releasetime.*?>(.*?)

.*?integer.*?>(.*?).*?fraction.*?>(.*?).*?
',re.S) items = re.findall(pattern,html) print(items)

成功将一页的信息打印出来,以列表的形式,下面是输出结果:


Python爬虫-猫眼电影排行_第3张图片

将提取的匹配结果从列表转换成字典格式

def parse_one_page(html):
    pattern = re.compile('
.*?board-index.*?>(.*?).*?data-src="(.*?)".*?name.*?a.*?>(.*?).*?star.*?>(.*?)

.*?releasetime.*?>(.*?)

.*?integer.*?>(.*?).*?fraction.*?>(.*?).*?
',re.S) items = re.findall(pattern,html) for item in items: yield{ 'index':item[0], 'image':item[1], 'title':item[2].strip(), 'actor':item[3].strip()[3:] if len(item[3])>3 else '', 'time':item[4].strip()[5:] if len(item[4])>5 else '', 'score':item[5].strip() + item[6].strip() }




写入文件

dumps是将dict转化成str格式
content是一个字典类型的数据,一部电影的提取结果
ensure_ascii=False保证写入文件的是中文而不是Unicode编码

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




分页爬取

if __name__=='__main__':
    for i in range(10):
        main(offset=i*10)
        time.sleep(1)




本章总结

通过本次练习,加强掌握requests和re库的用法,这只是一个简单的爬虫实例,后续会继续更新更多的爬虫文章
ps:参考教程:Python3爬虫开发实战
源代码会在后续中上传至github

你可能感兴趣的:(Python爬虫-猫眼电影排行)