路飞学城Python-Day150
最近由于在忙别的事情,所以路飞的课程就往后延期了,感觉很难受,不过我还是依然坚持学下去,必须的
最近在忙的事情
1.进入了数据分析行业,需要学习更多的知识
2.开始对数据收集负责,写各种爬虫
3.对数据行业很感兴趣,于是建立了自己的vpn
爬虫课程:
豆瓣爬虫,github地址
# 1.使用任意代理IP进行如下操作
# 2.使用requests模块进行豆瓣电影的个人用户登录操作
# 3.使用requests模块访问个人用户的电影排行榜->分类排行榜->任意分类对应的子页面
# 4.爬取需求3对应页面的电影详情数据
# 5.爬取3对应页面中滚动条向下拉动2000像素后加载出所有电影详情数据,存储到本地json文件中或者相应数据库中
# 【备注】电影详情数据包括:海报url、电影名称、导演、编剧、主演,类型,语言,上映日期,片长,豆瓣评分
import random
import re
import requests
from PIL import Image
from io import BytesIO
import lxml
from bs4 import BeautifulSoup as bs
import json
import sys
import time def get_info(url):
'''
解析网页页面数据,有可能会解析失败导致文件无法保存成json
:param url:
:return:
'''
page = requests.get(url).text
sec = random.randint(2, 6)
print('防止禁用爬虫,程序等待%s秒' % sec)
time.sleep(sec)
data = {}
data['导演'] = 'None'
data['编剧'] = 'None'
data['主演'] = 'None'
data['类型'] = 'None'
data['语言'] = 'None'
data['上映日期'] = 'None'
data['片长'] = 'None'
data['海报url'] = 'None'
data['电影名称'] = 'None'
data['豆瓣评分'] = 'None'
soup = bs(page, 'lxml')
# 海报url
poster_url = soup.find('div', {'id': 'content'}).find('a', {'class': 'nbgnbg'}).find('img')['src']
# 电影名称
mov_name = soup.find('div', {'id': 'content'}).find('h1').find('span').text
language = soup.find_all('div', {'id': 'info'})
base_info = []
for i in language:
base_info.append(i.text)
# print(base_info)
for i in base_info:
try:
director_name = re.findall('导演:(.*)', i)[0].replace('/', ',')
screenwriter_name = re.findall('编剧:(.*)', i)[0].replace('/', ',')
actor_name = re.findall('主演:(.*)', i)[0].replace('/', ',')
type_name = re.findall('类型:(.*)', i)[0].replace('/', ',')
language = re.findall('语言:(.*)', i)[0].replace('/', ',')
data_on = re.findall('上映日期:(.*)', i)[0].replace('/', ',')
mov_time = re.findall('片长:(.*)', i)[0].replace('/', ',')
data['导演'] = director_name
data['编剧'] = screenwriter_name
data['主演'] = actor_name
data['类型'] = type_name
data['语言'] = language
data['上映日期'] = data_on
data['片长'] = mov_time
except Exception as e:
pass # 豆瓣评分
score = soup.find('div', {'class', 'grid-16-8 clearfix'}).find('div', {'class': 'rating_self clearfix'}).find(
'strong').text
try:
data['海报url'] = poster_url
data['电影名称'] = mov_name
data['豆瓣评分'] = score
except Exception as e:
pass
with open('./详细信息/%s.json' % mov_name.replace(' ','').replace(':','').replace(':',''), 'w+', encoding='utf-8') as fp:
json.dump(data, fp) def view_bar(num):
'''
一个假的进度条
:param num:
:return:
'''
# rate = num / total
# rate_num = int(rate * 100)
r = '\r[%s%s]' % (">" * num, " " * (100 - num))
sys.stdout.write(r)
sys.stdout.flush() def main_core():
'''
基础信息的配置
:return:
'''
# 基本信息配置
# UA配置
header_list = [
# 遨游
{"user-agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)"},
# 火狐
{"user-agent": "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"},
# 谷歌
{
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 "
"(KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"},
]
# IP段配置,如果失效了就要再去http://www.goubanjia.com/找http的ip段
proxy_list = [
{"http": "117.191.11.103:8080"},
{'http': '173.249.43.105:3128'},
{'http': '110.249.177.114:8060'},
]
# 用户登录账号信息
data = {
'source': 'movie',
'redir': 'http://movie.douban.com/',
'form_email': 'a873245193@sina.com',
'form_password': 'dota2009',
'login': '登录',
}
param = {
'type_name': '喜剧',
'type': '',
'interval_id': '100:90',
'action': '',
}
# 登录url
url = 'http://www.douban.com/accounts/login'
# 分类url
get_url = 'http://movie.douban.com/typerank'
# 初始化基本配置,随机选择UA和ip段
header = random.choice(header_list)
proxy = random.choice(proxy_list)
session = requests.session()
res1 = session.get(url=url, headers=header, proxies=proxy) # 如果产生了验证码就要解析
try:
page_text = res1.text
soup = bs(page_text, 'lxml')
cap = soup.find('div', {'class': 'item item-captcha'}).find('img')
check_id = soup.find('div', {'class': 'captcha_block'}).find('input', {'name': 'captcha-id'})
check_value = re.findall('value="(.*)"', str(check_id))[0]
img_src = re.findall('src="(.*)"', str(cap))[0]
response = requests.get(img_src)
image = Image.open(BytesIO(response.content))
image.show()
check_code = input('请输入验证码>>>').strip()
data['captcha-solution'] = check_code
data['captcha-id'] = check_value
except Exception as e:
print('没有产生验证码,程序继续>>>')
res = session.post(url=url, headers=header, data=data, proxies=proxy)
page_text = res.text
# +------------------------------------------------------------------+
count_url = 'http://movie.douban.com/j/chart/top_list_count'
count_param = {
'type': '',
'interval_id': '100:90',
}
count_req = session.get(url=count_url, params=count_param, proxies=proxy)
# print(type(count_req.text))
count_dict = json.loads(count_req.text)
total_num = count_dict['total']
total_url = 'http://movie.douban.com/j/chart/top_list'
total_num_list = []
total_param = {
'type': '',
'interval_id': '100:90',
'action': "",
'start': '',
'limit': total_num,
}
print('downloading....')
total_req = session.get(url=total_url, params=total_param, proxies=proxy)
print('loading....')
for i in range(0, 101):
time.sleep(0.1)
view_bar(i)
print('\n')
total_json = json.loads(total_req.text)
for i in total_json:
url = i['url']
print(url)
get_info(url) if __name__ == '__main__':
main_core()
豆瓣爬虫
路飞学城Python-Day150的更多相关文章
- 路飞学城—Python爬虫实战密训班 第三章
		路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ... 
- 路飞学城—Python爬虫实战密训班 第二章
		路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ... 
- 路飞学城Python爬虫课第一章笔记
		前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ... 
- 路飞学城-Python开发集训-第3章
		学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ... 
- 路飞学城-Python开发集训-第1章
		学习体会: 在参加这次集训之前我自己学过一段时间的Python,看过老男孩的免费视频,自我感觉还行,老师写的代码基本上都能看懂,但是实际呢?....今天是集训第一次交作业的时间,突然发现看似简单升级需 ... 
- 路飞学城-Python开发集训-第4章
		学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ... 
- 路飞学城-Python开发集训-第2章
		学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ... 
- 路飞学城-Python开发-第二章
		''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ... 
- 路飞学城-Python开发-第三章
		# 数据结构: # goods = [ # {"name": "电脑", "price": 1999}, # {"name&quo ... 
- 路飞学城-Python开发-第一章
		# 基础需求: # 让用户输入用户名密码 # 认证成功后显示欢迎信息 # 输错三次后退出程序 username = 'pandaboy' password = ' def Login(username ... 
随机推荐
- 【学习笔记】有向无环图上的DP
			手动博客搬家: 本文发表于20180716 10:49:04, 原地址https://blog.csdn.net/suncongbo/article/details/81061378 首先,感谢以下几 ... 
- 洛谷 P2144 BZOJ 1003 [FJOI2007]轮状病毒
			题目描述 轮状病毒有很多变种.许多轮状病毒都是由一个轮状基产生.一个n轮状基由圆环上n个不同的基原子和圆心的一个核原子构成.2个原子之间的边表示这2个原子之间的信息通道,如图1. n轮状病毒的产生规律 ... 
- LightOJ - 1231 - Coin Change (I)
			先上题目: 1231 - Coin Change (I) PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: ... 
- Docker 入门,镜像,安装, 数据,网络,配置
			https://yeasy.gitbooks.io/docker_practice/basic_concept/image.html 
- [bzoj2529][Poi2011]Sticks_贪心
			Sticks bzoj-2529 Poi-2011 题目大意:给你n根木棒,每种木棒有长度和颜色,颜色共有k种,求满足条件的3根木棒使得这3根木棒颜色互不相同且可以围成三角形. 注释:$1\le n ... 
- MyBatis在注解上使用动态SQL(@select使用if)
			1.用script标签包围,然后像xml语法一样书写 @Select({"<script>", "SELECT * FROM tbl_order", ... 
- Android执行时ART载入OAT文件的过程分析
			在前面一文中,我们介绍了Android执行时ART,它的核心是OAT文件.OAT文件是一种Android私有ELF文件格式,它不仅包括有从DEX文件翻译而来的本地机器指令.还包括有原来的DEX文件内容 ... 
- spring 获取对象方式
			1 通过配置文件注入 1.配置文件里配置注入信息 2.class中加入注解的接口(set get. 构造函数等) 2.通过注解方式获得 1. 在class中对方法加入注解信息 (类标示 :@Servi ... 
- BZOJ1053 反素数
			题目大意 对于任何正整数x,其约数的个数记作g(x).如果某个正整数x满足对任意的0<i<x,都有g(x)>g(i) ,则称x为反质数.现在给定一个数N,求出不超过N的最大的反质数. ... 
- c28---const
			// // main.c // const关键字,节省内存空间,放在字符表里面, #include <stdio.h> int main(int argc, const char * ar ... 
