最近新型肺炎闹得很厉害,于是我就自己写了一个爬虫,爬取最新疫情的情况。
什么是爬虫?
爬虫也就是网络蜘蛛,是一种按照一定的规则,自动爬取万维网的信息的程序或者脚本。
它是怎么工作的?
其实就是通过脚本,向服务器发起访问请求,然后得到服务器返回的结果后,就会返回内容。如果还不明白的话,可以看一下小品:
用户:爬虫,去给我爬取网站上的内容!
爬虫:好的。
(爬虫找到服务器)
爬虫:我能获取你们网页上的内容吗?
服务器:好的,请稍后。
(爬虫得到了用户需要的内容)
爬虫:用户,我爬取到了内容。
用户:干得好!
当然这是在服务器没有使用反爬措施的情况下。如果服务器使用了反爬措施的话,就会出现以下情况:
爬虫:我能获取你们网页上的内容吗?
服务器:滚!
这时就要使用请求头(也就是使用user-agent),让服务器以为是浏览器要获取内容,而不是爬虫,就放行了。
接下来是操作时间
咱们回到正题上,如果要爬取网页上的内容,我们要用到的包如下:
urllib
re
爬取的地址如下:
当然你其他网站可以(最好是实时更新的)
接下来,上代码!
# 上次网易那个爬取数据过旧,这次换了个梅斯的页面
# 导入模块
from urllib import request
import re
# 别忘了请求头(headers),以防万一
user_agent = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0"
headers = {"User-Agent": user_agent}
# 爬取网站地址
req = request.Request("http://m.medsci.cn/wh.asp",headers=headers)
resp = request.urlopen(req)
# 读取页面
html = resp.read()
headline = re.findall(r'<tr style="border: 1px solid black;font-weight:bold;">.*</tr>',html.decode('utf-8'))
result = re.findall(r'<tr style="border-left:1px solid #F00;border-top:1px solid black">.*</tr>',html.decode('utf-8'))
time = re.findall(r'<p class="head-time">.*</p>',html.decode('utf-8'))
total = re.findall(r'<p class="head-title">.*</p>',html.decode('utf-8'))
# 进行数据清洗
headline = str(headline)
headline = headline.replace('''['<tr style="border: 1px solid black;font-weight:bold;"><td style="border: 1px solid black;">''',"")
headline = headline.replace('''</td><td style="border: 1px solid black;">'''," ")
headline = headline.replace('''</td></tr>']''',"")
total = str(total)
total = total.replace('''['<p class="head-title">''','')
total = total.replace('''</p>']''','')
result = str(result)
result = result.replace('''['<tr style="border-left:1px solid #F00;border-top:1px solid black"><td style="border: 1px solid black;">''',"")
result = result.replace('''</td><td style="border: 1px solid black;">'''," ")
result = result.replace(''''<tr style="border-left:1px solid #F00;border-top:1px solid black"><td style="border: 1px solid black;">''',"")
result = result.replace("</td></tr>'","")
result = result.replace('<td style="border: 1px solid black;"></td>',"0")
result = result.replace(', ',"\n")
result = result.replace(']',"")
time = str(time)
time = time.replace('''['<p class="head-time">''',"")
time = time.replace('''</p>']''',"")
# 输出结果
print("=================================================================")
print(total)
print(headline)
print(result)
print(time)
终端输出结果如下:
=================================================================
全部:确诊 11904 例 密切接触 131881 例 疑似 16192 例 治愈 206 例 死亡 257 例
地区 确诊 密切接触 疑似 治愈 死亡
湖北 7153 36838 119 249
浙江 599 10023 15
广东 520 1965 11
河南 422 6238 751 3 2
湖南 389 6960 3
安徽 297 4997 3
江西 286 7548 9
重庆 238 4789 13 2
四川 207 4425 3 1
山东 202 5614 72 2
江苏 202 3084 5
上海 153 9804 167 9 1
福建 144 2501 116
北京 139 115 5 1
广西 100 2700 11 2
河北 96 2045 88 1
云南 91 2642 228 1
陕西 87 1979 116
黑龙江 80 1106 181 1
辽宁 60 671 1
海南 57 827 1 1
山西 47 1101 75 1
天津 37 201 154
甘肃 35 556
贵州 29 416 3 2
宁夏 26 792 1
内蒙古 20 396 2
新疆 18 902
吉林 17 831 10 1
香港 12 300
台湾 10
青海 9 135
澳门 7
西藏 1
印度 1
墨西哥 0 7
菲律宾 0 4
巴西 0 1
沙特 0
泰国 19 5
日本 15 1
新加坡 13
韩国 12
澳大利亚 9 2
马来西亚 8
美国 6
德国 5
法国 5
阿联酋 4
加拿大 3
越南 2
英国 2
俄罗斯 2
意大利 2
尼泊尔 1
柬埔寨 1
斯里兰卡 1
芬兰 1
西班牙 1
瑞典 1
厄瓜多尔 0 1
哥伦比亚 0 1
截至 2020-2-1 14:33:04 数据统计
请程序员朋友们尽量避免前往人多的地方,出门戴好口罩。
最后希望各位程序员朋友们能够注意安全!
武汉加油!
中国加油!