豆瓣爬虫代码Python(豆瓣 爬虫)

http://www.itjxue.com  2023-04-02 20:48  来源:未知  点击次数: 

Python爬虫实战(1)requests爬取豆瓣电影TOP250

爬取时间:2020/11/25

系统环境:Windows 10

所用工具:Jupyter Notebook\Python 3.0

涉及的库:requests\lxml\pandas\matplotlib\numpy

蛋肥想法: 先将电影名称、原名、评分、评价人数、分类信息从网站上爬取下来。

蛋肥想法: print数据列表后发现电影原名、分类信息等存在不需要的字符,需预先处理;同时因为后续想做一个豆瓣电影TOP250的维度分布图,而同一电影存在多个发行国家、类型(如“法国 美国 / 剧情 动作 犯罪”),为了简(偷)便(懒),这里均取第一个作为记入的数据;最后将数据保存为xlsx。

蛋肥想法: 蛋肥想知道在豆瓣电影TOP250中年份、国家、类型的维度数据,为了练手,使用刚才保存成xlsx的数据,并分别画成雷达图、柱形图、扇形图。

python爬虫怎么处理豆瓣网页异常请求

1.URLError

首先解释下URLError可能产生的原因:

网络无连接,即本机无法上网

连接不到特定的服务器

服务器不存在

在代码中,我们需要用try-except语句来包围并捕获相应的异常。下面是一个例子,先感受下它的风骚

Python

1

2

3

4

5

6

7

? ?

import urllib2

requset = urllib2.Request('')

try:

urllib2.urlopen(requset)

except urllib2.URLError, e:

print e.reason

? ?

我们利用了 urlopen方法访问了一个不存在的网址,运行结果如下:

Python

1

? ?

[Errno 11004] getaddrinfo failed

? ?

它说明了错误代号是11004,错误原因是 getaddrinfo failed

2.HTTPError

HTTPError是URLError的子类,在你利用urlopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中它包含一个数字”状态码”。举个例子,假如response是一个”重定向”,需定位到别的地址获取文档,urllib2将对此进行处理。

其他不能处理的,urlopen会产生一个HTTPError,对应相应的状态吗,HTTP状态码表示HTTP协议所返回的响应的状态。下面将状态码归结如下:

100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。

101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。

102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。

200:请求成功 处理方式:获得响应的内容,进行处理

201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到

202:请求被接受,但处理尚未完成 处理方式:阻塞等待

204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃

300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃

301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL

302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL

304:请求的资源未更新 处理方式:丢弃

400:非法请求 处理方式:丢弃

401:未授权 处理方式:丢弃

403:禁止 处理方式:丢弃

404:没有找到 处理方式:丢弃

500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。

501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。

502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。

503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。

HTTPError实例产生后会有一个code属性,这就是是服务器发送的相关错误号。

因为urllib2可以为你处理重定向,也就是3开头的代号可以被处理,并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码。

下面我们写一个例子来感受一下,捕获的异常是HTTPError,它会带有一个code属性,就是错误代号,另外我们又打印了reason属性,这是它的父类URLError的属性。

Python

1

2

3

4

5

6

7

8

? ?

import urllib2

req = urllib2.Request('httt/cqcre')

try:

urllib2.urlopen(req)

except urllib2.HTTPError, e:

print e.code

print e.reason

? ?

运行结果如下

Python

1

2

? ?

403

Forbidden

? ?

错误代号是403,错误原因是Forbidden,说明服务器禁止访问。

我们知道,HTTPError的父类是URLError,根据编程经验,父类的异常应当写到子类异常的后面,如果子类捕获不到,那么可以捕获父类的异常,所以上述的代码可以这么改写

Python

1

2

3

4

5

6

7

8

9

10

11

? ?

import urllib2

req = urllib2.Request('hcqcre')

try:

urllib2.urlopen(req)

except urllib2.HTTPError, e:

print e.code

except urllib2.URLError, e:

print e.reason

else:

print "OK"

? ?

如果捕获到了HTTPError,则输出code,不会再处理URLError异常。如果发生的不是HTTPError,则会去捕获URLError异常,输出错误原因。

另外还可以加入 hasattr属性提前对属性进行判断,代码改写如下

Python

1

2

3

4

5

6

7

8

9

10

11

12

? ?

import urllib2

req = urllib2.Request('httcqcre')

try:

urllib2.urlopen(req)

except urllib2.URLError, e:

if hasattr(e,"code"):

print e.code

if hasattr(e,"reason"):

print e.reason

else:

print "OK"

? ?

首先对异常的属性进行判断,以免出现属性输出报错的现象。

以上,就是对URLError和HTTPError的相关介绍,以及相应的错误处理办法,小伙伴们加油!

python爬虫抓取电影top20排名怎么写

初步接触python爬虫(其实python也是才起步),发现一段代码研究了一下,觉得还比较有用处,Mark下。?

上代码:

#!/usr/bin/python#coding=utf-8#Author: Andrew_liu#mender:cy"""

一个简单的Python爬虫, 用于抓取豆瓣电影Top前100的电影的名称

Anthor: Andrew_liu

mender:cy

Version: 0.0.2

Date: 2017-03-02

Language: Python2.7.12

Editor: JetBrains PyCharm 4.5.4

"""import stringimport reimport urllib2import timeclass DouBanSpider(object) :

"""类的简要说明

主要用于抓取豆瓣Top100的电影名称

Attributes:

page: 用于表示当前所处的抓取页面

cur_url: 用于表示当前争取抓取页面的url

datas: 存储处理好的抓取到的电影名称

_top_num: 用于记录当前的top号码

"""

def __init__(self):

self.page = 1

self.cur_url = "h0?start={page}filter=type="

self.datas = []

self._top_num = 1

print u"豆瓣电影爬虫准备就绪, 准备爬取数据..."

def get_page(self, cur_page):

"""

根据当前页码爬取网页HTML

Args:

cur_page: 表示当前所抓取的网站页码

Returns:

返回抓取到整个页面的HTML(unicode编码)

Raises:

URLError:url引发的异常

"""

url = self.cur_url ? ? ? ?try:

my_page = urllib2.urlopen(url.format(page=(cur_page - 1) * 25)).read().decode("utf-8") ? ? ? ?except urllib2.URLError, e: ? ? ? ? ? ?if hasattr(e, "code"): ? ? ? ? ? ? ? ?print "The server couldn't fulfill the request."

print "Error code: %s" % e.code ? ? ? ? ? ?elif hasattr(e, "reason"): ? ? ? ? ? ? ? ?print "We failed to reach a server. Please check your url and read the Reason"

print "Reason: %s" % e.reason ? ? ? ?return my_page ? ?def find_title(self, my_page):

"""

通过返回的整个网页HTML, 正则匹配前100的电影名称

Args:

my_page: 传入页面的HTML文本用于正则匹配

"""

temp_data = []

movie_items = re.findall(r'span.*?class="title"(.*?)/span', my_page, re.S) ? ? ? ?for index, item in enumerate(movie_items): ? ? ? ? ? ?if item.find("nbsp") == -1:

temp_data.append("Top" + str(self._top_num) + " " + item)

self._top_num += 1

self.datas.extend(temp_data) ? ?def start_spider(self):

"""

爬虫入口, 并控制爬虫抓取页面的范围

"""

while self.page = 4:

my_page = self.get_page(self.page)

self.find_title(my_page)

self.page += 1def main():

print u"""

###############################

一个简单的豆瓣电影前100爬虫

Author: Andrew_liu

mender: cy

Version: 0.0.2

Date: 2017-03-02

###############################

"""

my_spider = DouBanSpider()

my_spider.start_spider()

fobj = open('/data/moxiaokai/HelloWorld/cyTest/blogcode/top_move.txt', 'w+') ? ?for item in my_spider.datas: ? ? ? ?print item

fobj.write(item.encode("utf-8")+'\n')

time.sleep(0.1) ? ?print u"豆瓣爬虫爬取完成"if __name__ == '__main__':

main()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102

运行结果:?

?

(责任编辑:IT教学网)

更多

推荐综合特效文章