爬取豆瓣电影信息
时间:2018-12-10
本文章向大家介绍爬取豆瓣电影信息,主要包括爬取豆瓣电影信息相关应用实例、知识点总结和注意事项,具有一定的参考价值,需要的朋友可以参考一下。
昨天写了一个小爬虫,爬取了豆瓣上2017年中国大陆的电影信息,网址为豆瓣选影视,爬取了电影的名称、导演、编剧、主演、类型、上映时间、片长、评分和链接,并保存到MongoDB中。
一开始用的本机的IP地址,没用代理IP,请求了十几个网页之后就收不到数据了,报HTTP错误302,然后用浏览器打开网页试了一下,发现浏览器也是302。。。
但是我不怕,我有代理IP,哈哈哈!详见我前一篇随笔:爬取代理IP。
使用代理IP之后果然可以持续收到数据了,但中间还是有302错误,没事,用另一个代理IP请求重新请求一次就好了,一次不行再来一次,再来一次不行那就再再来一次,再再不行,那。。。
下面附上部分代码吧。
1.爬虫文件
import scrapy
import json
from douban.items import DoubanItem
parse_url = "https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=%E7%94%B5%E5%BD%B1&start={}&countries=%E4%B8%AD%E5%9B%BD%E5%A4%A7%E9%99%86&year_range=2017,2017"
class Cn2017Spider(scrapy.Spider):
name = 'cn2017'
allowed_domains = ['douban.com']
start_urls = ['https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=%E7%94%B5%E5%BD%B1&start=0&countries=%E4%B8%AD%E5%9B%BD%E5%A4%A7%E9%99%86&year_range=2017,2017']
def parse(self, response):
data = json.loads(response.body.decode())
if data is not None:
for film in data["data"]:
print(film["url"])
item = DoubanItem()
item["url"] = film["url"]
yield scrapy.Request(
film["url"],
callback=self.get_detail_content,
meta={"item": item}
)
for page in range(20,3200,20):
yield scrapy.Request(
parse_url.format(page),
callback=self.parse
)
def get_detail_content(self,response):
item = response.meta["item"]
item["film_name"] = response.xpath("//div[@id='content']//span[@property='v:itemreviewed']/text()").extract_first()
item["director"] = response.xpath("//div[@id='info']/span[1]/span[2]/a/text()").extract_first()
item["scriptwriter"] = response.xpath("///div[@id='info']/span[2]/span[2]/a/text()").extract()
item["starring"] = response.xpath("//div[@id='info']/span[3]/span[2]/a[position()<6]/text()").extract()
item["type"] = response.xpath("//div[@id='info']/span[@property='v:genre']/text()").extract()
item["release_date"] = response.xpath("//div[@id='info']/span[@property='v:initialReleaseDate']/text()").extract()
item["running_time"] = response.xpath("//div[@id='info']/span[@property='v:runtime']/@content").extract_first()
item["score"] = response.xpath("//div[@class='rating_self clearfix']/strong/text()").extract_first()
# print(item)
if item["film_name"] is None:
# print("*" * 100)
yield scrapy.Request(
item["url"],
callback=self.get_detail_content,
meta={"item": item},
dont_filter=True
)
else:
yield item
2.items.py
文件
import scrapy
class DoubanItem(scrapy.Item):
#电影名称
film_name = scrapy.Field()
#导演
director = scrapy.Field()
#编剧
scriptwriter = scrapy.Field()
#主演
starring = scrapy.Field()
#类型
type = scrapy.Field()
#上映时间
release_date = scrapy.Field()
#片长
running_time = scrapy.Field()
#评分
score = scrapy.Field()
#链接
url = scrapy.Field()
3.middlewares.py
文件
from douban.settings import USER_AGENT_LIST
import random
import pandas as pd
class UserAgentMiddleware(object):
def process_request(self, request, spider):
user_agent = random.choice(USER_AGENT_LIST)
request.headers["User-Agent"] = user_agent
return None
class ProxyMiddleware(object):
def process_request(self, request, spider):
# Called for each request that goes through the downloader
# middleware.
ip_df = pd.read_csv(r"C:\Users\Administrator\Desktop\douban\douban\ip.csv")
ip = random.choice(ip_df.loc[:, "ip"])
request.meta["proxy"] = "http://" + ip
return None
4.pipelines.py
文件
from pymongo import MongoClient
client = MongoClient()
collection = client["test"]["douban"]
class DoubanPipeline(object):
def process_item(self, item, spider):
collection.insert(dict(item))
5.settings.py
文件
DOWNLOADER_MIDDLEWARES = {
'douban.middlewares.UserAgentMiddleware': 543,
'douban.middlewares.ProxyMiddleware': 544,
}
ITEM_PIPELINES = {
'douban.pipelines.DoubanPipeline': 300,
}
ROBOTSTXT_OBEY = False
DOWNLOAD_TIMEOUT = 10
RETRY_ENABLED = True
RETRY_TIMES = 10
程序共运行1小时20分21.473772秒,抓取到2986条数据。
最后,
还是要每天开心鸭!
- 企业应用中使用Silverlight 3
- oracle:db-link使用
- 5个炫酷的Python工具,你都用过么?
- 保护ASP.NET 应用免受 CSRF 攻击
- .NET:Entity Framework 笔记
- redis 学习笔记(1)-编译、启动、停止
- 致研究者:2018 AI研究趋势
- redis 学习笔记(3)-master/slave(主/从模式)
- 解决Chrome或其它WebKit浏览器input和textarea的黄色/蓝色边框问题
- eclipse/intellij Idea集成jetty
- nginx学习(1):编译、安装、启动
- Immutable(不可变)集合
- nginx学习(2):启动gzip、虚拟主机、请求转发、负载均衡
- 使用WiX制作简单MSI安装程序
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用二叉树实现自动求导(Python版)
- 上海展盟网络科技有限公司的 gamebox 组件注入进程导致软件崩溃
- IdentityServer4 3.1.x 迁移到 4.x
- 淘宝用户行为数据分析
- PyTorch中Transformer模型的搭建
- A轮公司数据分析面试经验
- Pytorch转NCNN的流程记录
- 算法图解:如何找出栈中的最小值?
- 滴滴出行二面笔试题
- spring JdbcTemplate 查询,参数中使用BeanPropertyRowMapper的作用
- 百万级类别的分类模型的拆分训练
- 关于Spring定义的preDestroy修饰的方法不执行,有以下两种原因,总有一款适合你
- CSP201912-2-回收站选址题目解析-Java ,
- Spring boot框架快速入门
- SpringBoot 跨域问题:Access to XMLHttpRequest at ‘***‘ from origin ‘***‘ has been blocked by CORS policy