Scrapy中用xpath/css爬取豆瓣电影Top250:解决403HTTP status code is not handled or not allowed...

news/2024/7/19 11:29:17 标签: python, 爬虫, 操作系统

好吧,我又开始折腾豆瓣电影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文件

这个文件就是一些基本的配置,比如访问网站的延迟代理等等,在这里我们设置下将爬取的数据以指定的格式保存到指定目录

python has-numbering">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如下:

python has-numbering">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

爬虫doubanpy文件">步骤四:生成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方法:

python has-numbering"># -*- 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

转载于:https://www.cnblogs.com/xiaoleiel/p/8301509.html


http://www.niftyadmin.cn/n/1060892.html

相关文章

ASP.NET页面之间传递值的几种方式

页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值、存储对象传值、ajax、类、model、表单等。但是一般来说,常用的较简单有QueryString,Session,Cookies,Application,Server.Transfer。 一…

RabbitMq 之简单队列

简单队列类似于我们的生产者,消费者, 一个生产者,对应一个消费者. 直接上代码: package com.j1.rabbitmq.simple;import com.j1.rabbitmq.util.ConnectionUtil;import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.Queuei…

POJ 1276 (多重背包) Cash Machine

题意&#xff1a; 有n种纸币&#xff0c;已知每种纸币的面值和数量&#xff0c;求所能凑成的不超过cash的最大总面值。 分析&#xff1a; 这道题自己写了一下TLE了&#xff0c;好可耻。。 找了份比较简洁的代码抄过来了。。poj1276 1 #include <cstdio>2 #include <cs…

Chrome开发工具

你可能已经熟悉了Chrome开发工具的基本功能。: DOM检查器、样式面板和JavaScript控制台。 但也有一些不太为人所知的特性可以显著提高你调试或开发应用的速度。 黑色主题 Chrome开发工具的内置了黑色主题。你可以通过点击开发工具窗口右上角的三点图标&#xff0c;之后点击进入…

【计量经济学导论】13. 虚拟变量与双重差分

文章目录虚拟变量与双重差分虚拟变量的模型设定虚拟变量的回归分析虚拟变量的综合应用结构变化分析交互效应分析双重差分模型双重差分模型的优点虚拟变量与双重差分 虚拟变量的模型设定 首先我们先对解释变量中的定性因素和定量因素作以下阐述&#xff1a; 定量因素&#xf…

如何在SSIS的脚本组件中访问变量

如何在SSIS的脚本组件中访问变量 原文:如何在SSIS的脚本组件中访问变量这是一个小问题&#xff0c;我们在SSIS的设计中很多地方都会用到变量&#xff0c;我习惯性地将“变量”和“表达式”称为SSIS的灵魂&#xff0c;虽然不见得绝对准确&#xff0c;但它们确实是保证一个SSIS包…

【计量经济学导论】14. 定性响应回归模型

文章目录定性响应回归模型线性概率模型线性概率模型的模型设定线性概率模型的缺点解决方案两种非线性概率模型Probit 模型Logit 模型两种模型的比较极大似然估计似然比检验拟合优度检验定性响应回归模型 线性概率模型 线性概率模型的模型设定 当我们在用多元线性回归模型去解…

Web应用程序部署结构

Web容器要求应用程序部署时&#xff0c;必须按照下图结构。 WEB-INF&#xff1a;该目录为固定的&#xff0c;放在这个文件夹中的文件或目录对外界来说是封闭的&#xff0c;客户端没办法用HTTP的任何方式直接访问到WEB-INF中的文件或目录。 web.xml&#xff1a;该文件是Web应用程…