动态爬取豆瓣电影中“更多”电影详情数据

动态爬取豆瓣电影中“更多”电影详情数据

作业需求:

1.使用任意代理IP进行如下操作
2.使用requests模块进行豆瓣电影的个人用户登录操作
3.使用requests模块访问个人用户的电影排行榜->分类排行榜->任意分类对应的子页面
4.爬取需求3对应页面的电影详情数据
5.爬取3对应页面中滚动条向下拉动2000像素后加载出所有电影详情数据,存储到本地json文件中或者相应数据库中
【备注】电影详情数据包括:海报url、电影名称、导演、编剧、主演,类型,语言,上映日期,片长,豆瓣评分

建议:用Pycharm开发

 开发中经验总结:

1、设置多个代理ip每次随机选取

2、在测试阶段建议先把数据下载到本地,在本地取保存的数据,避免被反爬处理,,导致因访问频繁无法进行数据处理

3、本次数据解析采用:

soup = BeautifulSoup(content_page, 'lxml')

4、加深了对Beautiful Soup对象类型---Tag对象的理解

https://www.cnblogs.com/wuwenyan/p/4773427.html

4.1 Tag

Tag对象

    Tag就是html文件中的标签以及标签之间的内容,例如以下就是一个Tag。

1 <title>The Dormouse's story</title>

movie_detail = soup.select('.subject > #info > span')[2].select('span > a')

 注意:如果得到的是'bs4.element.Tag'类型的对象可以继续进行后续的.操作,即能进行soup对象所能进行的操作,
所以需要确保一个对象是'bs4.element.Tag'类型后再进行后续对其的操作,例如后面将介绍的.find方法是Tag对象才拥有的。

5、python BeautifulSoup怎么获取无标签文本? 

-------------------------------------------------------

--------------------

# 下面的方法可以获取全部内容 info所在标签下的所有文本信息
span_class = soup.select('#info')
for index in span_class:
    print(index.text)

自己测试用的代码:

import os,sys
#添加环境变量
BASE_DIR = os.path.abspath(__file__)
sys.path.append(BASE_DIR)
from bs4 import BeautifulSoup
import json

#电影详情数据包括:海报url、电影名称、导演、编剧、主演,类型,语言,上映日期,片长,豆瓣评分

fp2 = open('douban_detail.html', 'r', encoding='utf-8')
#content_page = requests.get(url=movie_url, headers=settings.headers,proxies=settings.proxy).text
soup = BeautifulSoup(fp2,'lxml')
# https://www.cnblogs.com/wuwenyan/p/4773427.html
img_url = soup.select('#mainpic > a > img')[0]['src']
print('img:::',img_url)
movie_name = soup.select('#content > h1 > span')[0].text
# 只取中文--文件好命名
print('电影名字:',movie_name.split(' ')[0])
print('电影名字:',movie_name)
movie_detail = soup.select('.subject > #info > span')
movie_director = movie_detail[0].select('span > a')

# print(movie_director)
name_list = ''
for director in movie_director:
    name_list += '/'+director.text
print('导演::',name_list)

screenwriter = movie_detail[1].select('span > a')
name_list2 = ''
for writer in screenwriter:
    name_list2 += '/' + writer.text
print('编剧::', name_list2)

name_list3 = ''
movie_crew = movie_detail[2].select('span > a')
for actor in movie_crew:
    name_list3 += '/' + actor.text
print('演员::', name_list3)
#-----------------------------------------------
movie_type = soup.find_all('span',property="v:genre")
name_list4 = ''
for actor in movie_type:
    name_list4 += '/' + actor.text
print('类型',name_list4)
print('-----------------')



# 下面的方法可以获取全部内容
content_list = ''
content_list += '电影名字:'+movie_name+'
'+ '海报url:'+img_url
span_class = soup.select('#info')
for index in span_class:
    content = index.text
    content_list+=content
print(content_list)
with open('detail.json','w',encoding='utf-8')as f:
    json.dump(content_list,f)
View Code

github地址 点击

原文地址:https://www.cnblogs.com/foremostxl/p/10076570.html