Scrapy中用xpath/css爬取豆瓣电影Top250:解决403HTTP status code is not handled or not allowed
好吧,我又开始折腾豆瓣电影top250了,只是想试试各种方法,看看哪一种的方法效率是最好的,一直进行到这一步才知道 scrapy的强大,尤其是和selector结合之后,速度飞起。。。。
下面我就采用scrapy爬取豆瓣电影top250的方法记录一下,里面采用了selector的xpath和css两种各实现了一遍,其中xpath的选取路径较为清晰以及能够直接选到标签属性,css则较为有点小抽象,没有xpath直观,优点是结构简单,书写方便。于是我都实现了一遍,汗哒哒。。。
步骤一:生成项目名称
从windows的cmd命令行或者ubuntu的终端下进入你想保存项目的文件下,输入一下代码:
scrapy startproject doubanmovie (注意:换成你的项目名称)
cd doubanmovie
- 1
- 2
cmd中进入doubanmovie后,也就是进入你的项目文件夹后,后面所有的在cmd下或者终端下进行的scrapy命令都是在这个目录下进行的。
步骤二:配置settings.py文件
这个文件就是一些基本的配置,比如访问网站的延迟代理等等,在这里我们设置下将爬取的数据以指定的格式保存到指定目录
FEED_URI = u'file:///E:/python/wswp-code/MyExample/MyScrapy/douban3.csv' #将抓取的数据存放到douban.csv文件中。(从E:/开始,换成你的目录)
FEED_FORMAT = 'CSV'
- 1
- 2
然后就是关闭代理了,默认使用代理,有些网页使用本地代理无法访问,否则会报错[scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
[scrapy] DEBUG: Crawled (403)HTTP status code is not handled or not allowed
此时,修改setting.py如下:
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
}
- 1
- 2
- 3
之后就可以正常爬取豆瓣电影网站了。
步骤三:配置items.py文件
import scrapy
class Doubanmovie3Item(scrapy.Item):
rank = scrapy.Field()#电影排名
title = scrapy.Field()#标题--电影名
link = scrapy.Field()#详情链接
star = scrapy.Field()#电影评分
rate = scrapy.Field()#评价人数
quote = scrapy.Field() #名句
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
步骤四:生成spider文件夹下的爬虫douban.py文件
在上面的cmd下或者终端下:
scrapy genspider douban
- 1
或者
scrapy genspider douban movie.douban.com
- 1
步骤五:配置spider文件夹下的douban.py文件
这里也就是重点了,爬取的规则和解析都在这里进行书写,我在这里采用了selector的xpath和css方法分别实现了一遍,就是想进行个对比,读者可以随便选择一个。
xpath方法:
# -*- coding: utf-8 -*-
import scrapy
from doubanmovie.items import DoubanmovieItem
class DoubanSpider(scrapy.Spider):
name = "douban"
allowed_domains = ["movie.douban.com"]
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
for info in response.xpath('//div[@class="item"]'):
item = DoubanmovieItem()
item['rank'] = info.xpath('div[@class="pic"]/em/text()').extract()
item['title'] = info.xpath('div[@class="pic"]/a/img/@alt').extract()
item['link'] = info.xpath('div[@class="pic"]/a/@href').extract()
item['star'] = info.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract()
item['rate'] = info.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[4]/text()').extract()
item['quote'] = info.xpath('div[@class="info"]/div[@class="bd"]/p[@class="quote"]/span/text()').extract()
yield item
# 翻页
next_page = response.xpath('//span[@class="next"]/a/@href')
if next_page:
url = response.urljoin(next_page[0].extract())
yield scrapy.Request(url, self.parse)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
css方法:
# -*- coding: utf-8 -*-
import scrapy
from doubanmovie.items import DoubanmovieItem
class DoubanSpider(scrapy.Spider):
name = "douban"
allowed_domains = ["movie.douban.com"]
start_urls = ['http://movie.douban.com/top250']
def parse(self, response):
for info in response.css('div.item'):
item = DoubanmovieItem()
item['rank'] = info.css('div.pic em::text').extract()
item['title'] = info.css('div.pic a img::attr(alt)').extract()
item['link'] = info.css('div.pic a::attr(href)').extract()
item['star'] = info.css('div.info div.bd div.star span.rating_num::text').extract()
rate = info.css('div.info div.bd div.star span')
item['rate'] = rate[3].css('::text').extract()
item['quote'] = info.css('div.info div.bd p.quote span::text').extract()
yield item
# 翻页
next_page = response.xpath('//span[@class="next"]/a/@href')
if next_page:
url = response.urljoin(next_page[0].extract())
yield scrapy.Request(url, self.parse)
"""
补充点关于css的用法
Scrapy的中Css 选择器
//通过 名为 video_part_lists 的Class 中下面的 li 标签
liList = response.css('.video_part_lists li')
for li in liList:
再通过li 标签获取 a 标签中得 href 属性
name= li.css('a::attr(href)').extract()
"""
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
步骤六:启动爬虫,观察日志
在上面的cmd中或者终端下:
scrapy crawl douban -s LOG_LEVEL=INFO
- 1
或者
scrapy crawl douban -s LOG_LEVEL=DEBUG
- 1
这个设置可以观察到详细的运行日志
步骤七:解决乱码问题
此时在你之前设定的保存文件的目录下,有了一个.csv文件,用window的记事本或者notepad++打开的话,可以正常显示;但是用excel打开的话则可能出来乱码,此时只需要重新用记事本打开然后另存为ANSI编码,然后就能用window的excel打开了。
附上参考的链接:
http://www.jianshu.com/p/62e0a588ee0d
http://www.tuicool.com/articles/Un2MNfe
http://blog.csdn.net/heu07111121/article/details/50832999
http://www.tuicool.com/articles/eymema
Scrapy中用xpath/css爬取豆瓣电影Top250:解决403HTTP status code is not handled or not allowed的更多相关文章
- scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250
scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...
- scrapy爬取豆瓣电影top250
# -*- coding: utf-8 -*- # scrapy爬取豆瓣电影top250 import scrapy from douban.items import DoubanItem class ...
- urllib+BeautifulSoup无登录模式爬取豆瓣电影Top250
对于简单的爬虫任务,尤其对于初学者,urllib+BeautifulSoup足以满足大部分的任务. 1.urllib是Python3自带的库,不需要安装,但是BeautifulSoup却是需要安装的. ...
- python 爬虫&爬取豆瓣电影top250
爬取豆瓣电影top250from urllib.request import * #导入所有的request,urllib相当于一个文件夹,用到它里面的方法requestfrom lxml impor ...
- 【转】爬取豆瓣电影top250提取电影分类进行数据分析
一.爬取网页,获取需要内容 我们今天要爬取的是豆瓣电影top250页面如下所示: 我们需要的是里面的电影分类,通过查看源代码观察可以分析出我们需要的东西.直接进入主题吧! 知道我们需要的内容在哪里了, ...
- python2.7爬取豆瓣电影top250并写入到TXT,Excel,MySQL数据库
python2.7爬取豆瓣电影top250并分别写入到TXT,Excel,MySQL数据库 1.任务 爬取豆瓣电影top250 以txt文件保存 以Excel文档保存 将数据录入数据库 2.分析 电影 ...
- 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用
学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python requests的使用. 1.准备工作 在pycharm中安装request库 ...
- Python爬虫入门:爬取豆瓣电影TOP250
一个很简单的爬虫. 从这里学习的,解释的挺好的:https://xlzd.me/2015/12/16/python-crawler-03 分享写这个代码用到了的学习的链接: BeautifulSoup ...
- Python 2.7_利用xpath语法爬取豆瓣图书top250信息_20170129
大年初二,忙完家里一些事,顺带有人交流爬取豆瓣图书top250 1.构造urls列表 urls=['https://book.douban.com/top250?start={}'.format(st ...
随机推荐
- Vue-router路由基础总结(二)
一.命名路由 有时我们通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候.你可以在创建 Router 实例的时候,在 routes 配置中给某个路由设置名称. 我 ...
- [译]ES读写文档时shard-replication模型
官网页面:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-replication.html 本文是对官网页面的 ...
- Mac触控板常用的手势操作
Mac触控板常用的手势操作 学习了:http://topbook.cc/archives/151 一个手指直接点击,类似Windows中鼠标左键功能,同时在苹果Safari等浏览器中,这个手势还 ...
- Xshell连接mysql数据库乱码问题解决思路总结
乱码问题一直是一件让人头疼的事情,乱码就是编码格式不统一产生的,下面将一些常见的解决思路整理: 先Xshell连接上数据库,查看数据的编码格式: 一般需要看这么几个地方(附修改命令): 1.数据库的编 ...
- MySQL的GRANT命令(创建用户)
本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 (删除用户与删除权限:drop user '用户名 ...
- recess----2.Controller里面取用request信息
事实上,第一个APP里面除了没有model,其它的都有用过了,但是需要单独拎出来看看清楚. Recess框架里面的controller就是一个典型的MVC框架的controller,它负责处理从浏览器 ...
- dubbo注冊zookepper奇妙IP_续
原文章地址:http://blog.csdn.net/lele2426/article/details/39530409#4483369 后来server须要连接外网.配置DNS后又開始出现奇妙的IP ...
- 面向对象知识点之statickeyword的使用
<?php /*由static定义的属性和方法称为静态成员和静态方法.static定义的属性和方法是属于类的,在对象之间共享.*/ /*比如能够通过定义一个静态变量来统计类实例化了多少个对象*/ ...
- vpngate 的使用
第一次为小日本打广告.. .我仅仅想仰天大喊..玛的戈壁. .. 竟然活到这个份上了...想出去看看的往下看.. vpngate 下载: http://pan.baidu.com/s/1hq5x3Ly ...
- 在 SELECT 查询中使用集运算符
在 SELECT 查询中使用集运算符,可以将来自两个或多个查询的结果合并到单个结果集中. 在进行集运算之前,请确保: (1)所有输入集合中,列数和列的顺序必须相同. (2)对应的列中,数据类型必须兼容 ...