Python爬虫网页学习
下面是自己学习爬虫的思路。
由于动态网页爬取不会,特意挑了一个静态网页进行爬虫。
Python 爬取网站:https://voice.baidu.com/act/newpneumonia/newpneumonia/
爬虫程序顺序:获取网页 —>> 解析网页 —>> 存储数据
【1】获取网页可用的Python库:requests、urllib3和selenium(浏览器模拟,爬取动态网页需要)
- 此处我是用requests来获取网页代码
相关示例:多进程多线程抓取、登录抓取、突破IP封禁和服务器抓取
【2】解析网页技术:re正则表达式、BeautifulSoup、lxml(mei yong guo)
进阶:处理中文乱码
安装BeautifulSoup库命令 : pip install BeautifulSoup4
- 此处使用Python的re正则表达式进行字符匹配,然后找到我想要的代码截取下来。
【3】存储数据:相关数据库处理,老衲不会而且此处用不到
先进行单次爬虫从网站上面获取数据,然后使用线程方式每60秒获取一次,以此达到不断更新的目的,下面是Python程序代码。
import requests
import re
import json
import os
import time
import threading
# https://voice.baidu.com/act/newpneumonia/newpneumonia/ 百度公告网址
# https://news.163.com/special/epidemic/ 163网站
# 时间戳
# 线程类
class gzbd(threading.Thread):
def __init__(self, name, threadID, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print("开启线程: " + self.name)
while 1:
get_message()
time.sleep(self.counter)
def get_message(): # 爬取网站
os.system("cls") # 刷新界面
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400', # 伪装成QQ浏览器
'Host': 'voice.baidu.com' # 网站域名
}
link = "https://voice.baidu.com/act/newpneumonia/newpneumonia/" # 爬虫网站连接
r = requests.get(link, headers=headers, timeout=5) # 国内疫情
if r.status_code == 200: # 网页正常
texta = re.search(r"\"summaryDataIn\":(.*?),\"summaryDataOut", r.text, re.I | re.M)
mapLastUpdatedTime = re.search(r"\"mapLastUpdatedTime\":\"(.*?)\",\"caseList\"", r.text, re.I | re.M)
print("-------------------------------------------")
print("网络数据更新至", mapLastUpdatedTime.group(1))
print("-------------------------------------------")
js = json.loads(texta.group(1)) # JS对象转换成字典
print(r"累计确诊:", js["confirmed"], "\t昨日+", js["confirmedRelative"])
print(r"治愈病例:", js["cured"], "\t昨日+", js["curedRelative"])
print("-------------------------------------------")
print(r"无症状 :", js["asymptomatic"], "\t\t昨日+", js["asymptomaticRelative"])
print(r"外境输入:", js["overseasInput"], "\t\t昨日+", js["overseasInputRelative"])
print("-------------------------------------------")
print(r"疑似病例:", js["unconfirmed"], "\t\t昨日+", js["unconfirmedRelative"])
print(r"死亡病例:", js["died"], "\t\t昨日+", js["diedRelative"])
print("")
pencent = float(js["cured"]) / (float(js["died"]) + float(js["cured"]))
print("治愈率:", pencent * 100, "%")
print(r"死亡率:", (1 - pencent) * 100, "%")
else: # 网页不正常
print("missing")
print("-------------------------------------------")
print(r"线程更新时间", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) # 显示当前时间
print("-------------------------------------------")
def main():
threads = []
thread1 = gzbd("get_message", 1, 60)
thread1.start() # 线程启动
threads.append(thread1) # 线程添加到列表
for t in threads:
t.join()
print("退出主线程")
if __name__ == '__main__':
main() #主程序
运行效果
为实现双击就能启动这个脚本,使用Windows上批处理方式启动Python程序
用一个文本保存下面代码,然后文本扩张名改成后缀为.bat
我的脚本路径是:E:\PyQt\Py\spider\gzbd3.py
start python E:\PyQt\Py\spider\gzbd3.py
双击它就可以运行,我感觉还挺爽的。