python id x_python爬虫之基础篇-id爬虫(3) 我爱(python)

我们爬虫归根到底 还是在爬取网页上的数据,那么首先就要得到网页的链接,标准的说法就是得到网页的URl, 那么不同的网站URL,再加上不同的页面URL也是不一样的,这时候就需要我们分析网页的URL。

事例如下:

。。。。

看到了么 ,这是爬取的古诗文网,让我们自己也优雅一把,哈哈

仔细看上面的网页链接

发现一个规律,就是我们翻到第二页,P变成了2,第三页,P变成了三,以此类推p在往上增加.

这个时候如果我们想要获取所有的关于名句的内容,那我们的P是不是也要增加,让我们一页一页的逐个查询呢,那肯定是的。

代码如下:

#coding:utf8

import urllib.request

import urllib.parse

#使用我们的抓包工具,获得本网页的headers(请求头)

headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"

}

# 定义一个下载的函数 ,当然你也可以 不使用函数

def downLoad(url):

# 打印一下 看看结果

print('downloading:' + url)

# 将 url和请求数据处理为一个request对象,供下面的urlopen调用

request = urllib.request.Request(url,headers=headers)

# try except 进行异常处理

try:

# urlopen访问的url

response = urllib.request.urlopen(request)

# 对访问的url进行读取

html = response.read()

except urllib.error.URLError as e:

# 我们访问网页的时候,可能会受到一些错误的信息,比如5xx 服务器端的错误,那我们就不需要管了,继续执行爬取任务即可

if hasattr(e,'code') and 500<=e.code<600:

return downLoad(url)

# 没有错误就返回一个空值,继续执行代码

return None

# 函数到最后是要返回一个网页的

return html

# 函数定义完成 ,下一步我们是不是就要去网页里面传网页URl了

p=1

while True:

downLoad(urlFormat.format(p))

p+=1

运行结果:运行几秒钟 我给关闭了。这说明我们确实是在爬取这些不同的网页。

但是仅仅这些 是不够的,假如说,古诗文服务器的网页之间有个某一页是没有的,我们做了已经做过了处理,就是上面异常捕获的时候(500<=e.code<600)

我们写了一个死循环 ,网页一直在爬取,实际上这是不可取的,想想如果爬取到最后一页了怎么办,而这个死循环还是在进行,肯定报错的~

所以:提供两种解决办法。第一个while 循环的条件改成爬取多少页结束,第二个,如果我们爬取到最后一页 再爬取几次爬取不到东西了,那就跳出循环,结束。

还有如果我们爬取的速度过快,服务器是会禁掉你的,因为服务器都已经觉得你是在恶意获取数据了,所以我们需要设置一个延时,可以引入python自带的time模块,也能自己写一个延迟模块。

更改代码如下:

#coding:utf8

import urllib.request

import urllib.parse

import time

#使用我们的抓包工具,获得本网页的headers(请求头)

headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"

}

# 定义一个下载的函数 ,当然你也可以 不使用函数

def downLoad(url):

# 打印一下 看看结果

print('downloading:' + url)

# 将 url和请求数据处理为一个request对象,供下面的urlopen调用

request = urllib.request.Request(url,headers=headers)

# try except 进行异常处理

try:

# urlopen访问的url

response = urllib.request.urlopen(request)

# 对访问的url进行读取

html = response.read()

except urllib.error.URLError as e:

# 我们访问网页的时候,可能会受到一些错误的信息,比如5xx 服务器端的错误,那我们就不需要管了,继续执行爬取任务即可

if hasattr(e,'code') and 500<=e.code<600:

return downLoad(url)

# 没有错误就返回一个空值,继续执行代码

return None

# 函数到最后是要返回一个网页的

return html

# 函数定义完成 ,下一步我们是不是就要去网页里面传网页URl了

p=1

r =0

while p<30:

html = downLoad(urlFormat.format(p))

p+=1

# 每次执行一个之后,让我们的代码休息2秒钟,再爬取另外的数据。

# 延迟函数那个 ,留到下一节。哈哈~~

time.sleep(2)

# 如果没有得到东西,写一个参数r记录

if html ==None:

r+=1

# 如果连续五个次都没有获得数据,就不再执行循环

if r >5:

break

else:

r =0

print('下载完成')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值