python爬虫入门 ✦ 爬取猫眼电影Top100

此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。

注:因初接触python爬虫,代码和思路差劲的地方请见谅。

爬虫四个步骤:1.请求网页 2.获取网页响应 3.解析网页 4.保存数据

1.解析网页

1.首先我们来看一下猫眼电影top100的 url

https://maoyan.com/board/4?offset=0			#第一页
https://maoyan.com/board/4?offset=10		#第二页
https://maoyan.com/board/4?offset=20		#第三页
...
...
https://maoyan.com/board/4?offset=90		#第十页

在这里插入图片描述
2.通过观察url可以发现,url的变化点就在 offset=这里,每个页面有10个电影,每一页递增10,清楚url的规则后,接下来我们就可以请求网页进行分析了。

# 请求url,因为一页有10个电影,共10页。这里用一个for函数取10个数字
for i in range(10):
    url = 'https://maoyan.com/board/4?offset=%s' % (i*10)
    # 网页响应,requests.get表示请求获取网页,text一般用于返回的文本
    response = requests.get(url).text

查看获取到response,也就是网页源代码,这里我们主要爬取画圈圈的五个点。主要用到正则表达式提取所需的内容
在这里插入图片描述

2.完整代码

# 导入模块
import re
import requests

# 请求url,因为一页有10个电影,共10页。这里用一个for函数取10个数字
for i in range(10):
    url = 'https://maoyan.com/board/4?offset=%s' % (i*10)
    
    # 网页响应,requests.get表示请求获取网页,text一般用于返回的文本
    response = requests.get(url).text

    # 解析网页,在请求网页成功后,就需要解析网页了。
    # 这里用到了正则表达式,有不清楚的欢迎在下方留言或指正我的错误。
    pattern = re.compile(
        '<dd>.*?board-index.*?>(\d+)</i>.*?class="name">'
        '<a+.*?>(.*?)</a>.*?class="star">(.*?)</p>.*?"releasetime">'
        '(.*?)</p>.*?"integer">(.*?)</i>.*?</dd>',re.S)

    # 给解析后的网页文本定义一个变量
    items = re.findall(pattern, response)
    
    # 遍历items,打印对应的内容,这里定义一个字典,可能会相对美观
    for item in items:
        d = {"ID": item[0],
             "电影": item[1],
             "演员": item[2].strip()[3:],
             "上映时间": item[3][5:],
             "评分:": item[4][0]}
        print(d)

上图,爬取猫眼电影top100成功后的图片
在这里插入图片描述

3.多线程代码

import re
import csv
import time
import requests
from threading import Thread


class Maoyan_Spider(object):
    def __init__(self):
        self.headers = {
            'User-Agent': "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
        }

    def get_page(self, url, headers):
        response = requests.get(url, headers=self.headers, verify=False)
        response.encoding = 'utf-8'
        if response.status_code == 200:
            return response.text
        return None

    def parse_page(self, url):
        html = self.get_page(url, headers=self.headers)
        pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
                             + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
                             + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
        items = re.findall(pattern, html)
        return items

    def write_to_file(self, url):
        items = self.parse_page(url)
        for item in items:
            with open('result.csv', 'a+', encoding='utf-8') as f:
                writer = csv.writer(f)
                writer.writerow(['index', item[0],
                                 'image', item[1],
                                 'title', item[2],
                                 'actor', item[3].strip()[3:],
                                 'time', item[4].strip()[5:],
                                 'score', item[5] + item[6]])

    def main(self, start, end):
        for i in range(start, end):
            url = 'http://maoyan.com/board/4?offset=' + str(i * 10)
            time.sleep(1)
            self.write_to_file(url)


if __name__ == '__main__':
    ms = Maoyan_Spider()
    t1 = Thread(target=ms.main, args=(0, 5))
    t2 = Thread(target=ms.main, args=(5, 10))
    t1.start()
    t2.start()

好了,本次的分享到这里结束。
有任何疑问欢迎在下方留言哦。

发布了34 篇原创文章 · 获赞 210 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_45081575/article/details/97242132