python爬虫入门 ✦ 爬取豆瓣电影Top250

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

项目案例目标:练习爬虫技术,获取高评分电影。

秉承着拿来主意,各位直接复制黏贴便可执行程序了。
这个是我的第一篇爬虫博客。该案例特简单,爬取豆瓣电影top250,跟着里边动手操作一遍,你也可以做成功哦。

1. 解析网页

爬虫主要是四个步骤:1.请求网页 2.获取网页响应 3.解析网页 4.保存数据。但在爬虫的过程中我们往往是先分析网页,再去请求网页。

1.首先我们来看一下豆瓣电影top250url,也就是网址啦。

https://movie.douban.com/top250?start=0&filter=			#第1页
https://movie.douban.com/top250?start=25&filter=		#第2页
https://movie.douban.com/top250?start=50&filter=		#第3...
...
https://movie.douban.com/top250?start=225&filter=		#第10

在这里插入图片描述2.通过观察url可以发现,url的变化点就在 start=这里,每一页递增25,清楚了url的规律后,接下来就可以请求网页进行分析了。

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

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

2.完整代码

# 导入模块
import re
import requests

# 请求url,因为一页有25个电影,共10页。这里用一个for函数取10个数字
for i in range(10):
    url = 'https://movie.douban.com/top250?start=%s&filter=' % (i * 25)

    # 网页响应,requests.get表示请求获取网页,text一般用于返回的文本
    response = requests.get(url).text

    # 解析网页,在请求网页成功后,就需要解析网页了。
    # 这里用到了正则表达式,有不清楚的欢迎在下方留言或指正我的错误。
    pattern = re.compile('<li>.*?<em class="">(.*?)</em>.*?<span class="title">'
                         '(.*?)</span>.*?<.*?"v:average">(.*?)</span>.*?<span>(.*?)'
                         '人评价</span>.*?<span class="inq">(.*?)</span>.*?',re.S)

    # 给解析后的网页文本定义一个变量
    items = re.findall(pattern, response)
    # 遍历items,打印对应的内容
    for item in items:
        print("ID:",item[0],
              "title:", item[1],
              "score:", item[2],
              "count:", item[3],
              "comment:", item[4])

3.多线程代码

# 导入模块
import re
import csv
import time
import json
import requests
from threading import Thread


class Douban_Spider(object):
    # 请求网页
    def get_page(self, url):
        res = requests.get(url)
        res.encoding = 'utf-8'
        if res.status_code == 200:
            return res.text
        return None

    # 利用正则解析网页
    def parse_page(self, url):
        html = self.get_page(url)
        pattern = re.compile('<li>.*?<em class="">(.*?)</em>.*?<span class="title">'
                             '(.*?)</span>.*?<.*?"v:average">(.*?)</span>.*?<span>(.*?)'
                             '人评价</span>.*?<span class="inq">(.*?)</span>.*?', 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('movietop250.csv', 'a+', encoding='utf-8') as f:
                writer = csv.writer(f)
                writer.writerow(["ID:", item[0],
                                 "title:", item[1],
                                 "score:", item[2],
                                 "count:", item[3],
                                 "comment:", item[4]])

    # 设置起始页
    def main(self, start, end):
        for i in range(start, end):
            url = 'https://movie.douban.com/top250?start=' + str(i * 25)
            time.sleep(1)  # 睡眠一秒,防止被封ip
            self.write_to_file(url)


# 执行程序
if __name__ == '__main__':
    dp = Douban_Spider()
    # dp.main()
    t1 = Thread(target=dp.main, args=(0, 5))
    t2 = Thread(target=dp.main, args=(5, 11))
    t1.start()
    t2.start()  # 启动刚刚创建2个线程
    t1.join()
    t2.join()  # 加入join后 ,子线程结束,主线程才结束,运行速度会变慢

上图,爬取豆瓣电影top250成功后的图片
在这里插入图片描述
好了,本次的分享到这里结束。
有任何疑问欢迎在下方留言哦。

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

猜你喜欢

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