数据爬取

首次接触爬取数据,跟着网上的教程安装了pychram,学习了基本的爬取操作。

复制代码
from os import path
import requests
from bs4 import BeautifulSoup
import json
import pymysql
import numpy as np
import time
#请求地址
url = 'https://ncov.dxy.cn/ncovh5/view/pneumonia?from=timeline&isappinstalled=0'
#为了避免反爬,伪装成浏览器:
#创建头部信息
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}
response =  requests.get(url,headers = headers)  #发送网络请求
#print(response.content.decode('utf-8'))#以字节流形式打印网页源码
content = response.content.decode('utf-8')
#print(content)
soup = BeautifulSoup(content, 'html.parser')#指定Beautiful的解析器为“html.parser”
'''*find()
返回的是第一个匹配的标签结果
*find_all()
返回的是所有匹配结果的列表'''
#世界确诊
listB = soup.find_all(name='script',attrs={"id":"getListByCountryTypeService2true"})
account = str(listB)#转化成字符串
#print(account)
messages = account[95:-21]#截取从52到后边倒数21个
print(messages)
messages_json = json.loads(messages)#json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。
print(messages_json)
valuesList = []
cityList = []
con=len(messages_json)#Python len() 方法返回对象(字符、列表、元组等)长度或项目个数
k=0
for i in range(len(messages_json)):#从0到len
    k=k+1#time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))格式化当前时间
    value = (k,time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),messages_json[i].get('provinceName'),None,messages_json[i].get('confirmedCount'),messages_json[i].get('suspectedCount'),messages_json[i].get('curedCount'),messages_json[i].get('deadCount'),messages_json[i].get('locationId'))
    valuesList.append(value)#进行添加到list中
#数据库的写入
#打开数据库连接
db = pymysql.connect("localhost", "root", "123", "payiqing", charset='utf8')
#使用此方法获取操作游标
cursor = db.cursor()

array = np.asarray(valuesList[0])
'''DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。
TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。 '''
sql_clean_province = "TRUNCATE TABLE world_map"
sql = "INSERT INTO world_map values (%s,%s,%s,%s,%s,%s,%s,%s,%s) "
'''>>>tuple([1,2,3,4])
(1, 2, 3, 4)
>>> tuple({1:2,3:4})    #针对字典 会返回字典的key组成的tuple
(1, 3)
>>> tuple((1,2,3,4))    #元组会返回元组自身
(1, 2, 3, 4)'''
value_tuple = tuple(valuesList)

try:
    cursor.execute(sql_clean_province)
    db.commit()
except:
    '''    connection.rollback()
该方法回滚自上一次调用 commit() 以来对数据库所做的更改'''
    print('执行失败,进入回调1')
    db.rollback()

try:
    '''cursor.executemany(sql, seq_of_parameters)
该例程对 seq_of_parameters 中的所有参数或映射执行一个 SQL 命令。'''
    cursor.executemany(sql, value_tuple)
    '''connection.commit()
该方法提交当前的事务。如果您未调用该方法,
那么自您上一次调用 commit() 以来所做的任何动作
对其他数据库连接来说是不可见的'''
    db.commit()
except:
    print('执行失败,进入回调3')
    db.rollback()
    '''    connection.close()
该方法关闭数据库连接。请注意,这不会自动调用 commit()。
如果您之前未调用 commit() 方法,就直接关闭数据库连接,
您所做的所有更改将全部丢失!'''
db.close()
posted @ 2020-06-10 17:03  Spongbob  阅读(139)  评论(0编辑  收藏  举报