<jupyter_start><jupyter_text>python 3.7    抓取数据 1. 发起请求获得响应 get2. 解析数据3. 保存数据<jupyter_code>import requests
from bs4 import BeautifulSoup
# 具体是https://news.qq.com/zt2020/page/feiyan.htm#/global中的数据
url='https://news.qq.com/zt2020/page/feiyan.htm'
response = requests.get(url)
# 这一步响应码为200 说明响应成功。
response.status_code<jupyter_output><empty_output><jupyter_text>分析爬取的页面 ![image.png](attachment:image.png)上方的js文件就是海外疫情数据源 ![image.png](attachment:image.png)上方是js文件的请求url 经过以上分析，发现爬取的页面是动态页面（异步加载）。所需数据在一个js文件中，并且知道了这个js文件的请求url，如下。<jupyter_code>js_url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_foreign&callback=jQuery341019592258844374566_1586865760214&_=1586865760215'<jupyter_output><empty_output><jupyter_text>修改js_url1. js_url中包含了callback（回调函数）的调用,我们不需要，所以删掉jQuery341019592258844374566_1586865760214  2. 因为js_url中的末尾部分的1586865760215表示时间戳，所以我们在这里替换为实时的时间戳。<jupyter_code># 计算当前的时间戳
import time
timestamp = int(time.time()*1000)  # 根据已知的时间戳1586865760215是13位的整数
js_url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_foreign&callback=&_=%d'%timestamp
response = requests.get(js_url)
if response.status_code ==200:
    print("response yes")
else:
    print("response no")
# js文件的响应是json。这里转换为dict类型
data_dict = response.json()
type(data_dict)<jupyter_output><empty_output><jupyter_text>补充 ： dict保存到 json文件  ，从json文件 读入  json.dumps()和json.loads()- json.dumps()和json.loads()是json格式处理函数（可以这么理解，json是字符串）    - json.dumps()函数是将一个Python数据类型列表进行json格式的编码（可以这么理解，json.dumps()函数是将字典转化为字符串）    - json.loads()函数是将json格式数据转换为字典（可以这么理解，json.loads()函数是将字符串转化为字典）- json.dump()和json.load()主要用来读写json文件函数<jupyter_code>import json
with open("./data_dict.json",'w',encoding='utf-8') as json_file:
        json.dump(data_dict,json_file,ensure_ascii=False)
with open("./data_json.json",'r',encoding='utf-8') as json_file:
        data_dict_read = json.load(json_file)
data_dict_read<jupyter_output><empty_output><jupyter_text>补充：用selenium+pandas 抓取动态页面反扒机制厉害，所以找不到js文件请求的话？可以尝试这种方法。思路：selenium抓取整个页面，然后用pandas将表格读出来。- selenium自动化测试工具，它可以驱动web浏览器。- 使用pandas来处理表格（要抓取的数据是表格数据,相对而言，如果用xpath方法则比较麻烦）<jupyter_code>from selenium import webdriver
import pandas as pd
# 需要指明Webdirver的路径（webdirver由浏览器官方提供，注意和浏览器的版本一致）。
driver_url = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver.exe"
# 打开浏览器窗口
driver = webdriver.Edge(executable_path=driver_url)
# 并打开特定网页
driver.get(url)
# 从dirver.page_source属性，获得网页html
html = driver.page_source
# 关闭浏览器窗口
driver.close()<jupyter_output><empty_output><jupyter_text>![image.png](attachment:image.png)          找到数据所在table<jupyter_code># 定位并读取数据所在的table。   
soup = BeautifulSoup(html,'lxml')  # 使用lxml解析器去解析html 
table = soup.find('div',class_="listWraper filterGray").find('table')
type(table)
# prettify()方法读到得是列表，由于只有一个表格，所以[0]
data_df = pd.read_html(table.prettify())[0]
data_df.head()
# 可以用下面的方式，去除最后一列
data_df = data_df.iloc[:,0:len(data_df.columns)-1]
data_df.head()<jupyter_output><empty_output><jupyter_text>补充:  DataFrame数据的保存与读取<jupyter_code>data_df.to_json('./data_df.json')
data_df_read = pd.read_json('./data_df.json',orient='values',encoding='utf-8')
data_df_read.head()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13701236917221693, 'fraction_numerical': 0.04630510624801776, 'mean_word_length': 9.375, 'pattern_counts': {'":': 0, '<': 29, '<?xml version=': 0, '>': 29, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 2}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '159402', 'license': 'MIT', 'n_tokens_mistral': 1696, 'n_tokens_neox': 1693, 'n_words': 117, 'path': 'test/crawl_COVID19_world.ipynb', 'repo_name': 'caffeflow/python_crawl_visual_COVID-19', 'size': '3153'}