我们爬虫归根到底 还是在爬取网页上的数据,那么首先就要得到网页的链接,标准的说法就是得到网页的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('下载完成')