最近由于在忙别的事情,所以路飞的课程就往后延期了,感觉很难受,不过我还是依然坚持学下去,必须的

最近在忙的事情

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的更多相关文章

  1. 路飞学城—Python爬虫实战密训班 第三章

    路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...

  2. 路飞学城—Python爬虫实战密训班 第二章

    路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...

  3. 路飞学城Python爬虫课第一章笔记

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ...

  4. 路飞学城-Python开发集训-第3章

    学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...

  5. 路飞学城-Python开发集训-第1章

    学习体会: 在参加这次集训之前我自己学过一段时间的Python,看过老男孩的免费视频,自我感觉还行,老师写的代码基本上都能看懂,但是实际呢?....今天是集训第一次交作业的时间,突然发现看似简单升级需 ...

  6. 路飞学城-Python开发集训-第4章

    学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ...

  7. 路飞学城-Python开发集训-第2章

    学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...

  8. 路飞学城-Python开发-第二章

    ''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...

  9. 路飞学城-Python开发-第三章

    # 数据结构: # goods = [ # {"name": "电脑", "price": 1999}, # {"name&quo ...

  10. 路飞学城-Python开发-第一章

    # 基础需求: # 让用户输入用户名密码 # 认证成功后显示欢迎信息 # 输错三次后退出程序 username = 'pandaboy' password = ' def Login(username ...

随机推荐

  1. 草草搞了个SERVLET的注册登陆功能

    按书来的,学习阶段,一切都好新奇..至少对比于DJANGO,好像复杂点点,但HTTP的东东,是相通的哈. package cc.openhome.controller; import java.io. ...

  2. HDU 4515

    刷水完毕,年月日,日日日日日日日日日日日日日日日日日日 #include <stdio.h> ,,,,,,,,,,,,}; ,M = ,D = ; int leap(int y) { == ...

  3. HDU 4512 最长公共上升子序列

    各种序列复习: (1)最长上升子序列. 1.这个问题用动态规划就很好解决了,设dp[i]是以第i个数字结尾的上升子序列的最长长度.那么方程可以是dp[i]=max(dp[j]+1).(j<i). ...

  4. 通俗编程——白话NIO之Buffer

    Buffer简单介绍 Buffer意为缓冲区.其本质上就是是一块可写入数据,然后能够从中读取数据的内存区域.通过该种方式有助于降低系统开销和提高外设效率.对于缓冲区我们早有所了解,比方在C中标准I/O ...

  5. swift初始化

    swift初始化 class INIT: NSObject { // 一个结构体的初始化 // 1.存储属性的初始化 struct Fahrenheit { var temperature :Doub ...

  6. 齐头并进完成任务——Java多线程(一)

    多线程(Multithread)指的是在单个进程中同时运行多个不同的线程,执行不同的任务.多线程意味着一个程序的多行语句块并发执行. 一.实现多线程 1.通过继承Thread类实现多线程. Threa ...

  7. Mysql 索引需要了解的几个注意

    索引是做什么的? 索引用于快速找出在某个列中有一特定值的行.不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行.表越大,花费的时间越多.如果表中查询的列有一个索引,MySQL能快 ...

  8. python 3.7 replace函数的坑

    使用replace时必须用 str=str.replace(old,new) 如果用 str.replace(old,new)会不起作用. 注意:若str中没有old变量,也不会报错 应用: 练习题 ...

  9. php---依赖倒转(反转控制)原则

    一.简介 依赖注入和控制反转说的实际上是同一个东西,它们是一种设计模式,这种设计模式用来减少程序间的耦合 优点:使用依赖注入,最重要的一点好处就是有效的分离了对象和它所需要的外部资源,使得它们松散耦合 ...

  10. Ubuntu16.04系统下汉字显示为方框解决办法(图文详解)

    不多说,直接上干货! 问题详情 问题分析 今天一打开Ubuntu系统,竟然不支持中文显示了.开始时以为是搜狗拼音的问题,然后重装了一遍fcitx,然后用重装了一遍搜狗输入法.可是重装后问题根本没有解决 ...