美文网首页程序员码农的世界
120行代码爬取豆瓣电影top250

120行代码爬取豆瓣电影top250

作者: e1d319510233 | 来源:发表于2019-04-23 11:27 被阅读16次

笔者最近学习爬虫,拿豆瓣电影进行练手,无奈豆瓣电影存在反爬机制,爬完250就会重定向要求我进行登陆操作,所以我这一次只爬取前50进行相关测试,废话不多说,我们来看下源代码

这次用到的还是requests库,BeautifulSoup解析库,和re进行辅助的正则匹配库,最后老样子利用pandas的DataFrame进行excel的写入

学习Python中的小伙伴,需要学习资料的话,可以前往我的微信公众号:速学Python,后台回复:简书,即可拿Python学习资料

这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。送给正在学习python的小伙伴!这里是python学习者聚集地,欢迎初学和进阶中的小伙伴!

import requests

from bs4 import BeautifulSoup

import re

import pandas

headers = {

    'Host':'movie.douban.com',

    'Origin':'movie.douban.com',

    'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Mobile Safari/537.36',

}

base_url = 'https://movie.douban.com/top250?start={}&filter='

response = requests.get('https://movie.douban.com/top250?start=0&filter=', headers = headers)

if response.status_code == 200:

    # print(response.text)

    pass

pattern1 = re.compile('<div.*?class="item">.*?<div.*?class="pic">.*?<a.*?href="(.*?)">', re.S) # 去掉所有换行符,并用正则表达式去匹配每一个页面的具体电影

urls = re.findall(pattern1, response.text)

directors = [] # 导演

names = [] # 电影名

stars = [] # 主演

countrys = [] # 电影的出产地

languages = [] # 电影语言

headers_urls = {

    'Host':'movie.douban.com',

    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'

}

# <span property="v:itemreviewed">肖申克的救赎 The Shawshank Redemption</span>

# <a href="/celebrity/1047973/" rel="v:directedBy">弗兰克·德拉邦特</a>

# <a href="/celebrity/1054521/" rel="v:starring">蒂姆·罗宾斯</a>

def base_urls(base_url):

    urls = []

    # 这里我们只能前两页做测试,所以range只设置到了50

    # for i in range(0, 275, 25):

    #    true_url = base_url.format(i)

    #    print(true_url)

    for i in range(0, 50, 25):

        true_url = base_url.format(i)

        print(true_url)

        response = requests.get(true_url, headers=headers)

        if response.status_code == 200:

            # print(response.text)

            pattern1 = re.compile('<div.*?class="item">.*?<div.*?class="pic">.*?<a.*?href="(.*?)">',re.S)

            # 去掉所有换行符,并用正则表达式去匹配每一个页面的具体电影

            url = re.findall(pattern1, response.text)

            # 因为这里是用findall,他返回的是一个列表,如果我们直接append,会导致列表嵌套,故我们这里用个for循环提取出列表的元素再append进去

            for i in url:

                urls.append(i)

    return urls

def parse_url(urls):

    # 因为只拿前两页做测试,所以range设置到50

    for i in range(0, 50, 1):

        res = requests.get(urls[i], headers = headers_urls)

        print(res)

        if res.status_code == 200:

            soup = BeautifulSoup(res.text, 'lxml')

            # 爬取电影名

            name = (soup.find('span', property="v:itemreviewed"))

            names.append(name.text)

            # print(names)

            # 爬取导演

            director = soup.find('a', rel="v:directedBy")

            directors.append(director.text)

            # print(director.text)

            # 爬取明星

            star_save = []

            for star in soup.find_all('a', rel="v:starring"):

                star_save.append(star.text)

                stars.append(star_save)

            # print(stars)

            # 爬取制片国家

            #<span class="pl">制片国家/地区:</span> 美国<br>

            # 学到的知识点:通过匹配文本内容找下个兄弟节点

            country = soup.find('span', text='制片国家/地区:').next_sibling[1:]

            countrys.append(country)

            # print(countrys)

            # 爬取影片语言

            # <span class="pl">语言:</span>

            language = soup.find('span', text='语言:').next_sibling[1:]

            languages.append(language)

            # print(language)

# print(directors)

# print(true_director)

# print(a)

if __name__ == '__main__':

    base = base_urls(base_url)

    print(base)

    print(len(base))

    parse_url(base)

    print(countrys)

    print(directors)

    print(languages)

    print(names)

    #

    # 最后我们将数据写入到一个excel表格里

    info ={'Filmname':names, 'Directors':directors, 'Country':countrys, 'Languages':languages}

    pdfile = pandas.DataFrame(info)

    # pdlook.to_excel('链家.xlsx', sheet_name="链家二手房广州")

    pdfile.to_excel('DoubanFilm.xlsx', sheet_name="豆瓣电影")

相关文章

  • Python学习

    python爬虫(五) python爬虫爬取豆瓣电影Top250数据 利用python爬取豆瓣电影TOP250页面...

  • 用23行代码爬取豆瓣音乐top250

    网上有各种爬取豆瓣电影top250的教程,虽然豆瓣音乐top250和豆瓣电影top250的爬取十分类似,但是我大致...

  • python爬虫

    1、爬取糗事百科 代码: 2、爬取淘宝手机信息 代码: 3、爬取中国大学排名 代码: 4、爬取豆瓣top250 代码:

  • Python学习第四天

    爬取豆瓣top250电影 输出结果: 爬取猫眼top100 输出结果:

  • scrapy爬取豆瓣电影

    scrapy爬取豆瓣电影,存储在MongoDB 本节分享用的Scrapy爬取豆瓣电影Top250的实战。 本节要实...

  • Python学习

    python爬虫(四) python爬虫爬取豆瓣电影数据 今天我们爬取一下豆瓣电影TOP250页面电影的数据,依然...

  • 正则表达式Python案例(2)-爬取豆瓣电影Top250

      通过Python代码实现爬取豆瓣电影Top250的电影列表,包括序号、电影名称、评分以及评论人数,并保存到文件...

  • Python爬取豆瓣电影TOP250

    爬取目标 爬取豆瓣电影TOP250信息并简单分析 爬取网址为https://movie.douban.com/to...

  • 爬虫入门练习(二)-抓豆瓣电影Top250

    本文参考:Python爬虫(3):爬取豆瓣电影TOP250 9.23更新:修改了代码,将抓取的数据存入MongoD...

  • node.js一个爬虫实例

    爬取豆瓣top250 测试

网友评论

    本文标题:120行代码爬取豆瓣电影top250

    本文链接:https://www.haomeiwen.com/subject/phnmgqtx.html