本文共有989字,读完大约需要5分钟。
本文继续记录 《手把手带你飞Python爬虫+数据清洗新手教程(一)》中未完成的处理任务。
1 回顾
上一篇中完成了第一页中表格内容的提取和处理,本篇要对第一页到第六页的表格内容进行提取和处理。
回顾一下代码:
import requests
#获取网页源代码
def get_source():
url = 'http://www.89ip.cn/index_1.html'
headers ={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}
res = requests.get(url,headers=headers).text
return res
#清洗数据
def get_data(res):
data = res.split('<tbody>')[1].split('</tbody>')[0].replace('\n','').replace('\t','').replace(' ','').replace('</tr>','').replace('</td>','').split('<tr>')
body = []
for row in data:
if '.'in row :
td = row.split('<td>')
td.pop(0)
body.append(tuple(td))
return body
#主函数
def main():
src = get_source()
page = get_data(src)
return page
#调用主函数
main()
上面是获取并处理第一页的表格内容的代码,其中包括了获取网页源代码的模块和清洗数据的模块,可以想象一下获取并处理第一页到第八页的表格内容的代码包含什么模块。
2 分析网页结构
首先要导入requests库,然后要有获取网页源代码的模块,不过这个获取网页源代码的模块和上面代码中的略有不同,这个模块要能循环获取不同页面的网页源代码,想一想,怎样循环呢?
再来分析一下网页结构:
第一页对应的网址如下:
第二页对应的网址如下:
第三页对应的网址如下:
找到规律了吧?
因此,我们可以利用这个数字来循环获取不同网页的网页源代码。
3 代码实现
3.1 获取网页源代码模块
使用{}和format(‘a’)可以替换把{}替换成a。
下面的代码首先接收变量p,p是页码,然后把’http://www.89ip.cn/index_{}.html’中的{}替换为p的值,然后获取网页源代码,
#获取网页源代码
def get_source(p):
url = 'http://www.89ip.cn/index_{}.html'.format(p)
headers ={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}
res = requests.get(url,headers=headers).text
return res
3.2 清洗数据模块
清洗数据模块不需要改变,继续使用原来的清洗数据模块,代码如下:
def get_data(res):
data = res.split('<tbody>')[1].split('</tbody>')[0].replace('\n','').replace('\t','').replace(' ','').replace('</tr>','').replace('</td>','').split('<tr>')
body = []
for row in data:
if '.'in row :
td = row.split('<td>')
td.pop(0)
body.append(tuple(td))
return body
3.3 主函数模块
主函数模块需要有改变,因为本篇需要循环获取第一页到第八页的表格内容。
代码如下:
#主函数
def main():
#指定一个空字典pages
pages = {}
#循环处理第一页到第六页的表格内容
for p in range(1,6):
src = get_source(p)
page = get_data(src)
#给字典元素赋值,每个元素键为页码,值为一页表格的内容
pages[str(p)] = page
#设定任意时间停歇,防止对网站服务器造成过大的负载压力
time.sleep(random.random()*3)
return pages
for p in range(1,6)函数可以指定p在1到6中循环,每次循环加一。
time.sleep()可以设定间隔时间停歇。
random.random()可以用于生成一个0到1的随机浮点数。
需要导入time和random库。
4 完整代码
import requests
import time
import random
#获取网页源代码
def get_source(p):
url = 'http://www.89ip.cn/index_{}.html'.format(p)
headers ={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}
res = requests.get(url,headers=headers).text
return res
#清洗数据
def get_data(res):
data = res.split('<tbody>')[1].split('</tbody>')[0].replace('\n','').replace('\t','').replace(' ','').replace('</tr>','').replace('</td>','').split('<tr>')
body = []
for row in data:
if '.'in row :
td = row.split('<td>')
td.pop(0)
body.append(tuple(td))
return body
#主函数
def main():
pages = {}
for p in range(1,6):
src = get_source(p)
page = get_data(src)
pages[str(p)] = page
time.sleep(random.random()*3)
return pages
#调用主函数
main()
运行:
到这里就完成了。
晚安。