Python_爬虫系列_10.各种案例集合

前言

不积硅步何以致千里。

一、简单爬虫案例

1.爬取中国工程院院士信息包括头像和简介并存储

# 爬取中国工程院院士信息包括头像和简介并存储
import re
from urllib.request import urlopen

import  requests
url=r'https://www.cae.cn/cae/html/main/col48/column_48_1.html'
strhtml=requests.get(url)
pattern=r'<li class="name_list"><a href="(.+)" target="_blank">(.+)</a></li>'
furhtml=re.findall(pattern,strhtml.text)
# print(furhtml)
for  item in furhtml:
    perUrl, name = item
    realref=r'https://www.cae.cn/'+perUrl
    delhtml=requests.get(realref)
    # print(delhtml.text)
    pattern1=r'<img src="/cae/admin/upload/img/(.+)" style='
    result=re.findall(pattern1, delhtml.text,re.I)
    # print(result[0])
#https://www.cae.cn/cae/admin/upload/img/20200311095622881157087.jpg
#https://www.cae.cn/cae/admin/upload/img/20160504155634976300642.jpg
    picUrl = r'https://www.cae.cn/cae/admin/upload/img/' + result[0]
    with open(name + '.jpg', 'wb') as pic:
        pic.write(urlopen(picUrl).read())
#-----------------------------------------------

from urllib.request import urlopen

response =urlopen('http://www.baidu.com/')
result=response.read().decode('utf-8')

with open("first.html",'w',encoding='utf-8') as fp:
    fp.write(result)
    fp.close()

2、翻译

import requests
url="https://fanyi.baidu.com/sug"
s=input("请输入要翻译的单词:")
dat={
    "kw":s
}
resp=requests.post(url,data=dat)
print(resp.json())
resp.close()

3、豆瓣电影爬取

import requests
url="https://movie.douban.com/j/chart/top_list?"
para={
    'type': '24',
    'interval_id': '100:90',
    'action': '',
    'start': '20',
    'limit': '20',
}
header={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62"
}
resp=requests.get(url=url,params=para,headers=header)
with open("douban.txt", mode="w", encoding="utf-8") as f:
    f.write(resp.text)
print(resp.json())
f.close()
resp.close()

4、模块例子


import requests


def getHTNLtext(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "获取异常"

if __name__ == '__main__':
    url = "http://www.baidu.com/"
    print(getHTNLtext(url))

5、上机--爬虫1

1.编写写一个简单的爬虫程序,爬取武昌首义学院的学校要闻主题,理解爬虫的概念、网页的结构及爬虫工作原理。

import requests
from bs4 import BeautifulSoup # 从bs4库中导入BeautifulSoup
import re
from lxml import etree

def return_html():
    url = 'http://www.wsyu.edu.cn/'
    strhtml = requests.get(url) # get方式,获取网页数据
    strhtml.encoding=strhtml.apparent_encoding
    return  strhtml
def xpath_get(x):
    html=etree.HTML(x.text)
    ul=html.xpath("//li/p[@class='title']/a/text()")
    for i in ul:
        print("xpath_get---标题:"+i)
def re_get(x):
    pattern=r'<p class="title"><a href="(.+)" target="_blank" title="(.+)">.+</a></p>'
    data = re.findall(pattern, x.text)
    for i in data:
        print("re_get---标题:"+i[1])
def bs_get(x):
    soup = BeautifulSoup(x.text,'lxml')
    data = soup.select('#index > div.block.block1 > div > div.spot > div > ul > li> p>a')
    for item in data:
        print("bs_get---标题:"+item.get_text())
if __name__=='__main__':
    x=return_html()
    xpath_get(x)
    re_get(x)
    bs_get(x)

2.掌握API数据的获取方式,MongoDB数据库的安装、配置和数据的查询。
要求:

  • 1.安装好Python第三方库bs4,能正确使用Beautiful Soup库,中的select方法;
  • 2.学会使用页面审查元素的辅助工具,查看某元素的选择器。
  • 3.注册免费API并会阅读技术文档,熟悉API的运作方式。
import requests
import  json
import time
url='http://cdn.heweather.com/china-city-list.txt'
strhtml=requests.get(url)
strhtml.encoding=strhtml.apparent_encoding
data=strhtml.text
data1 = data.split("\n")
for i in range(6):
    data1.remove(data1[0])

for item in data1[:20]:
    url = 'https://devapi.heweather.net/v7/weather/3d?location=' + item[4:13] + '&key=6d16870a745349578f01e664d3482521'
    strhtm=requests.get(url)
    time.sleep(1)
    dic = strhtm.json()
    print(item[38:45]+item[4:13]+"的最高气温:"+dic["daily"][0]["tempMax"])

在这里插入图片描述

6、小说爬取

import requests
import json
import csv
from lxml import etree
# 预期的数据在网页中的字段
# 调用requests库生成会话
ss = requests.session()
# 为会话添加UA,初步过反爬虫
ss.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'}
# 请求目标网页
respond = ss.get(url='https://top.baidu.com/board?tab=novel')
# 解析目标网页
# items = bs4.BeautifulSoup(respond.text, 'lxml').select('.list-item')
# # # 预先准备储存结果的list
html=etree.HTML(respond.text)
title=html.xpath("//*[@id='sanRoot']/main/div[2]/div/div[2]/div/div[2]/a/div/text()")
auther=html.xpath("//*[@id='sanRoot']/main/div[2]/div/div[2]/div/div[2]/div[1]/text()")
type=html.xpath("//*[@id='sanRoot']/main/div[2]/div/div[2]/div/div[2]/div[2]/text()")
description=html.xpath("//*[@id='sanRoot']/main/div[2]/div/div[2]/div/div[2]/div[3]/text()")
description=html.xpath("//*[@id='sanRoot']/main/div[2]/div/div[2]/div/div[2]/div[3]/text()")
hotindex=html.xpath("//*[@id='sanRoot']/main/div[2]/div/div[2]/div/div[1]/div[2]/text()")
x=html.xpath("//*[@id='sanRoot']/main/div[2]/div/div[2]")
result = []
for i in x:
    title=i.xpath("./div/div[2]/a/div/text()")
    auther=i.xpath("./div/div[2]/div[1]/text()")
    type=i.xpath("./div/div[2]/div[2]/text()")
    description=i.xpath("./div/div[2]/div[3]/text()")
    hotindex=i.xpath("./div/div[1]/div[2]/text()")
    result.append(title)
    result.append(auther)
    result.append(type)
    result.append(description)
    result.append(hotindex)
print(result)

二、MongoDb的案例

1.MongoDB 模板

# '''先导入模块,没有的话就去 File > Settings 下载 或者 pip3 instll pymongo'''
import pymongo
# 连接到 MongoDB 数据库
mongoClient = pymongo.MongoClient(host=" 192.168.1.229", port=27017)

# 操作一个库,格式:mongoClient.库名  如果该库存在表示使用该库,如果该库不存在表示创建该库
db = mongoClient.DatabaseName

# 操作一个集合
collection = db.CollectionName

# 查询过滤后的数据
'''需要注意,python中只能使用列表进行排序,不能使用字典,所以sort后面不能使用{}需要换成[]'''
results = collection.find({"field3": "西宁"})

# 循环遍历并打印结果
for result in results:
    print(result)

# 操作结束后一定要记得关闭连接
mongoClient.close()

2、去哪儿网(搞了一上午,非常值得学习)

import time
import urllib.request

import requests
import pymongo
client = pymongo.MongoClient('localhost',27017) # 在MongoDB中创建数据库
book_qunar = client['qunar'] # 在数据库中创建表sheet_qunar_zyx
sheet_qunar_zyx = book_qunar['qunar_zyx']

# 获取出发地站点信息
url = 'https://touch.dujia.qunar.com/depCities.qunar'
strhtml = requests.get(url)
# print(strhtml.text)
dep_dict = strhtml.json()
# print(dep_dict)
for dep_item in dep_dict['data']:
    for dep in dep_dict['data'][dep_item]:
        a = []
        # print('departion', dep)
        url = 'https://touch.dujia.qunar.com/golfz/domestic/domesticDest?dep={0}&exclude=&extensionImg=255,175'.format(
            dep)

        time.sleep(1)
        strhtml = requests.get(url)
        arrive_dict = strhtml.json()
        for arr_item in arrive_dict['data']:
            for arr_item_1 in arrive_dict['data'][arr_item]:
                # print(arr_item_1)
                for arr_item_2 in arr_item_1['subModules']:
                    for query in arr_item_2['items']:
                        # print(query['query'])
                        if query['query'] not in a:
                            a.append(query['query'])
        # print("arrive:", a)
        for item in a:
            # print(item)
            urlx = 'https://touch.dujia.qunar.com/list?modules=list%2CbookingInfo%2CactivityDetail&dep={0}&' \
                   'query={1}&dappDealTrace=true&mobFunction=%E6%89%A9%E5%B1%95%E8%' \
                   '87%AA%E7%94%B1%E8%A1%8C&cfrom=zyx&it=dujia_hy_destination&date=&needNoResult=true&originalquery={2}&width=480&height=320&quality=90&limit=0,28&includeAD=true&qsact=' \
                   'search'.format(dep, item, item)
            header = {
                'User-Agent': ' Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Mobile Safari/537.36'
            }

            strhtml = requests.get(urlx)
            # print(strhtml.text)

            try:
                routeCount = int(strhtml.json()['data']['limit']['routeCount'])
                print(routeCount)
            except:
                continue  # 没有这条路径说明对应的出发地到目的地没有产品,直接跳过看下一个目的地
            for limit in range(0,routeCount,20):
                # print(item)
                urlx = 'https://touch.dujia.qunar.com/list?modules=list%2CbookingInfo%2CactivityDetail&dep={0}&' \
                       'query={1}&dappDealTrace=true&mobFunction=%E6%89%A9%E5%B1%95%E8%' \
                       '87%AA%E7%94%B1%E8%A1%8C&cfrom=zyx&it=dujia_hy_destination&date=&needNoResult=true&originalquery={2}&width=480&height=320&quality=90&limit={3},28&includeAD=true&qsact=' \
                       'search'.format(dep, item, item,limit)
                header = {
                    'User-Agent': ' Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Mobile Safari/537.36'
                }

                strhtml = requests.get(urlx)
                # print(strhtml.text)

            result = {
                'date': time.strftime('%Y-%m-%d', time.localtime(time.time())),
                'dep': dep,
                'arrive': item,
                'limit': limit,
                'result': strhtml.json()}
            sheet_qunar_zyx.insert_one(result)

3、pymongo的模板

import pymongo
#使用指定主机和端口的方法创建客户端实例
client=pymongo.MongoClient('localhost',27017)
book_weather=client['Try1']#数据库的实例
sheet_weather=book_weather['name']#集合的实例
#插入
sheet_weather.insert_one(dic['now'])#插入
#也可以使用 insert_many() 方法。通过给他的第一个参数传入一个**列表**

#查看
#默认是第一条
sheet_weather.find_one()
#可以加上筛选--不忘json
sheet_weather.find_one({'temp': '24'})
# print(sheet_weather.find())
# <pymongo.cursor.Cursor object at 0x04745CB0>
#全部数据
for item in sheet_weather.find():
    print(item)


# 统计count()
# 方法可以返回一次查询匹配的文件数。--old
print(sheet_weather.find().count())
# 方法可以返回一次查询匹配的文件数。--new
print(sheet_weather.estimated_document_count())
#方法加筛选--new
print(sheet_weather.count_documents({'text':'阴'}))

三、天气案例并写入数据库

第一部分

import  requests
import time
url='http://cdn.heweather.com/china-city-list.txt'
strhtml=requests.get(url)
strhtml.encoding = 'utf8'
data=strhtml.text
print(data)

data1=data.split("\n")

for i in range(6):
    data1.remove(data1[0])
print(data1)

for item in data1:
    print(item[2:13])
    #url='d'
    url='https://devapi.heweather.net/v7/weather/7d?location='+item[2:13]+'&key=509ff55cddc6407592f28f3fa3c80bf6'
    strhtml=requests.get(url)
    time.sleep(1)
    print(strhtml.text)
    dic = strhtml.json()
    # for item in dic["HeWeather6"][0]['daily_forecast']:
    #     print(item['tmp_max'])
    for item in dic['daily']:
        print(item['tempMax'])



第二部分

import requests
import time
import pymongo

client = pymongo.MongoClient('localhost', 27017)
book_weather = client['Try1']
sheet_weather = book_weather['name']

with open("china-city-list.txt", "r+", encoding="UTF-8")as f:
    data = f.read()
    data1 = data.split("\n")
    for i in range(6):
        data1.remove(data1[0])
# url='http://cdn.heweather.com/china-city-list.txt'
# strhtml=requests.get(url)
# strhtml.encoding = 'utf8'
# data=strhtml.text
# print(data)
# data1=data.split("\n")
# for i in range(6):
#     data1.remove(data1[0])
for item in data1[:2]:  # 为便于测试,仅取20行数据
    # url='https://free-api.heweather.net/s6/weather/forecast?location='+item[4:13]+'&key=6d16870a745349578f01e664d3482521'
    url = 'https://devapi.heweather.net/v7/weather/now?location=' + item[4:13] + '&key=6d16870a745349578f01e664d3482521'
    strhtml = requests.get(url)
    time.sleep(1)
    dic = strhtml.json()
    # print(['windDir'])
    #  for item in dic["HeWeather6"][0]['daily_forecast']:
    #       print(item['tmp_max'])
    # sheet_weather.insert_one(dic['now'])
# print(sheet_weather.find_one({'temp': '24'}))
# print({'_id':'6140720d59dc0def2d252e34'})

# print(sheet_weather.find())
# <pymongo.cursor.Cursor object at 0x04745CB0>
# 全部数据
# for item in sheet_weather.find():
#     print(item)

# count()
# 方法可以返回一次查询匹配的文件数。--old
# print(sheet_weather.find().count())
# 方法可以返回一次查询匹配的文件数。--new
print(sheet_weather.estimated_document_count())
# 方法加筛选--new
print(sheet_weather.count_documents({'text': '阴'}))

第三部分

import pymongo
client=pymongo.MongoClient('localhost',27017)
book_weather=client['weather']
sheet_weather=book_weather['sheet_weather_3']
# 查找键HeWeather6.basic.location值为北京的数据
for item in sheet_weather.find({'HeWeather6.basic.location':'北京'}):
    print(item)
#for item in sheet_weather.find({'daily.location':'北京'}):
#    print(item)

第四部分

import pymongo
client=pymongo.MongoClient('localhost',27017)
book_weather=client['weather']
sheet_weather=book_weather['sheet_weather_3']
for item in sheet_weather.find():
    # 因为数据需要3天的天气预报,因此循环3次
    for i in range(3):
        try: # 需要增加异常处理,有些表中的item项内容为空
            # 取出最低温的字符串
            tmp=item["HeWeather6"][0]['daily_forecast'][i]['tmp_min']
            # 使用update方法,将表中最低气温数据修改为数值型
            sheet_weather.update_one({'_id':item['_id']},{'$set':{'HeWeather6.0.daily_forecast.{}.tmp_min'.format(i):int(tmp)}})
        except:
            continue
    # 提取出最低气温低于5摄氏度的城市
    for item in sheet_weather.find({'HeWeather6.daily_forecast.tmp_min':{'$gt':5}}):
        print(item['HeWeather6'][0]['basic']['location'])

第五部分

import pymongo
client=pymongo.MongoClient('localhost',27017)
book_weather=client['weather']
sheet_weather=book_weather['sheet_weather_3']
# 查找键HeWeather6.basic.location值为北京的数据
for item in sheet_weather.find({'HeWeather6.basic.location':'北京'}):
    print(item)
#for item in sheet_weather.find({'daily.location':'北京'}):
#    print(item)

四.Selenium

  1. 浏览器驱动chromedriver下载地址
  2. 在Windows中,右键此电脑-属性-高级系统设置-环境变量系统环境变量-Path-(将chromedriver.exe任意路径下)

1、去哪网的案例

import requests
import urllib.request
import time
import random
from selenium import webdriver
from selenium.webdriver.common.by import By  # 用于指定HTML文件中的DOM元素
from selenium.webdriver.support.ui import WebDriverWait  # 用于等待网页加载完成
from selenium.webdriver.support import expected_conditions as EC  # 用于指定标志网页加载结束的条件

'''
去哪网PC端自由行 https://fh.dujia.qunar.com/?tf=package
ChromeDriver下载 https://npm.taobao.org/mirrors/chromedriver
'''


# 每次发送请求隔一会(模拟用户的输入和检查较慢)
def get_url(url):
    time.sleep(1)
    return (requests.get(url))


if __name__ == "__main__":
    # 用驱动打开Chrome浏览器
    driver = webdriver.Chrome()  # 初始化一个Chrome浏览器对象
    # dcap = dict(DesiredCapabilities.PHANTOMJS)
    # dcap["phantomjs.page.settings.loadImages"] = False
    # driver = webdriver.PhantomJS( desired_capabilities=dcap)
    # 出发地城市列表
    dep_cities = ["北京", "上海", "广州", "深圳", "天津", "杭州", "南京", "济南", "重庆", "青岛",
                  "大连", "宁波", "厦门", "成都", "武汉", "哈尔滨", "沈阳", "西安", "长春", "长沙", "福州",
                  "郑州", "石家庄", "苏州", "佛山", "烟台", "合肥", "昆明", "唐山", "乌鲁木齐", "兰州",
                  "呼和浩特", "南通", "潍坊", "绍兴", "邯郸", "东营", "嘉兴", "泰 州", "江阴", "金华", "鞍山",
                  "襄阳", "南阳", "岳阳", "漳州", "淮安", "湛江", "柳州", "绵阳"]
    # 对每个出发地
    for dep in dep_cities:
        # 去哪儿网点击目的地搜索时的RequestURL
        strhtml = get_url('https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep=' +
                          urllib.request.quote(dep) + '&extensionImg=255,175')
    # 查询到的就是该出发地选定后供选择的若干目的地
    arrive_dict = strhtml.json()
    # 这里得到的是列表中的一项项dict
    for arr_item in arrive_dict['data']:
        # 该dict里面subModules列表里的每一项
        for arr_item_1 in arr_item['subModules']:
            # 该项的item字段所示列表的每一项
            for query in arr_item_1['items']:
                # 通过浏览器打开网页
                driver.get("https://fh.dujia.qunar.com/?tf=package")
                # WebDriverWait(driver, 10)意思是使driver保持等待,最多10秒
                # .until()里指定等待的是什么事件
                # EC.presence_of_element_located()里面指定标志等待结束的DOM元素
                # 里面传入元组(By.ID, "depCity")意思是等待id="depCity"的元素加载完成
                WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID,
                                                                                "depCity")))
                # 在Chrome检查元素后,直接右键Copy XPath即可选择相应的元素!
                # 清空出发地文本框
                driver.find_element_by_xpath("//*[@id='depCity']").clear()
                # 将出发地写进去
                driver.find_element_by_xpath("//*[@id='depCity']").send_keys(dep)
                # 将目的地写进去
                driver.find_element_by_xpath("//*[@id='arrCity']").send_keys(query[" query "])
                # 点击[开始定制]按钮
                # // *[ @ id = "app"] / div / main

                driver.find_element_by_xpath("/html/body/div[2]/div[1]/div[2]/div[3]/ div / div[2] / div / a ").click()
                print("dep:%s arr:%s" % (dep, query["query"]))
                # 最多抓2页,每页有10项产品列表,故每条线路抓取2页,即20项产品列表
                for i in range(2):
                    # 随机等待5~6秒,模拟用户每页看个五六秒
                    time.sleep(random.uniform(5, 6))
                    # 关于[下一页]按钮:在不同的页上,下一页按钮的XPath是不一样的,比如下面两个
                    # // *[ @ id = "pager"] / div / a[7]
                    # // *[ @ id = "pager"] / div / a[8]
                    # 因此不能通过这种方式来实现点击下一页
                    # 可以用XPath获得翻页的整块元素,提取每个'下一页'按钮公共部分的XPath
                    pageBtns = driver.find_elements_by_xpath(
                        "html/body/div[2]/div[2]/div[7]")
                    # 如果获取不到页码按钮,说明从出发地到目的地没有产品,直接跳出
                    if pageBtns == []:
                        break
                # 旅行方案所有产品的列表
                # 提取每个旅行方案列表公共部分的XPath
                routes = driver.find_elements_by_xpath('//*[@id="list"]/div')
                for route in routes:
                    result = {
                        'date': time.strftime('%Y-%m-%d',
                                              time.localtime(time.time())),
                        'dep': dep,
                        'arrive': query['query'],
                        'result': route.text
                    }
                print(result)
                if i < 9:
                    # 找到翻页按钮,并点击翻页
                    btns = driver.find_elements_by_xpath(
                        "/html/body/div[2]/div[2]/div[7]")
                    for a in btns:
                        if a.text == u"下一页":
                            a.click()
                            break

driver.close()

2、百度设置调整

import time

from selenium import webdriver
#1.引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains

#1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口
driver = webdriver.Chrome()

driver.get("https://www.baidu.com")
driver.refresh()
driver.set_window_size(1400, 600)

#2.定位到要悬停的元素
element= driver.find_element_by_id("s-usersetting-top")

#3.对定位到的元素执行鼠标悬停操作
ActionChains(driver).move_to_element(element).perform()

#找到链接
elem1=driver.find_element_by_link_text("搜索设置")
elem1.click()

#通过元素选择器找到id=sh_2,并点击设置
# elem2=driver.find_element_by_id("sh_1")
# elem2.click()
time.sleep(2)

#保存设置
elem3=driver.find_element_by_link_text("保存设置")
elem3.click()

driver.switch_to.alert.accept()



3、截图(觉得有趣)

from selenium import webdriver
from time import sleep

driver =webdriver.Chrome()
driver.get('http://www.baidu.com')

driver.find_element_by_id('kw').send_keys('selenium')
driver.find_element_by_id('su').click()
sleep(2)

#1.截取当前窗口,并指定截图图片的保存位置
driver.get_screenshot_as_file("D:\\baidu_img.png")

driver.quit()

4、抽屉网的登录点赞

1.出处---GitHub上的值得参考

import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from lxml import etree
import requests
# 抽屉账号密码
PHONE = "18872623922"
PWD = "z123456789"
# 抽屉url
url = 'https://dig.chouti.com/'

# 初始化
def init():
    # 定义为全局变量,方便其他模块使用
    global browser, wait
    # 实例化一个chrome浏览器
    browser = webdriver.Chrome()
    # 最大化窗口
    browser.maximize_window()
    time.sleep(2)
    # 设置等待超时
    wait = WebDriverWait(browser, 20)

# 登录
def login():
    # 打开登录页面
    browser.get(url)
    # # 获取用户名输入框
    browser.find_element_by_id("login_btn").click()

    # 输入账号密码
    browser.find_element_by_name("phone").send_keys(PHONE)
    browser.find_element_by_name("password").send_keys(PWD)

    # 点击登录
    time.sleep(2)
    click_login_btn_js = 'document.getElementsByClassName("btn-large")[0].click()'
    browser.execute_script(click_login_btn_js)
    time.sleep(15)

    # 获取cookie
    get_cookies_js = "return document.cookie"
    cookie = browser.execute_script(get_cookies_js)
    print(cookie)

    with open("cookie.txt", "w", encoding="utf-8") as f:
        f.write(cookie)
    # page_source = browser.page_source
    # with open("page.html","w",encoding="utf-8") as f:
    #     f.write(page_source)

def readinfo():
    with open("cookie.txt", "r", encoding="utf-8") as f:
        cookie = f.read()

    base_url = "https://dig.chouti.com/"
    header_dict = {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
        "Accept-Encoding": "gzip, deflate, br",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Cache-Control": "max-age=0",
        "Connection": "keep-alive",
        "Host": "dig.chouti.com",
        "Referer": "https://dig.chouti.com/?showLogin=true",
        "Sec-Fetch-Mode": "navigate",
        "Sec-Fetch-Site": "same-origin",
        "Sec-Fetch-User": "?1",
        "Upgrade-Insecure-Requests": "1",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
    }
    r1 = requests.get(url=base_url, headers=header_dict)
    r1.encoding = r1.apparent_encoding

    html = etree.HTML(r1.content)

    # 文章id列表
    data_id_list = html.xpath("//a[@class='link-title link-statistics']/@data-id")
    print(data_id_list)

    lick_url = "https://dig.chouti.com/link/vote"
    header_dict = {
        "Accept": "application/json, text/javascript, */*; q=0.01",
        "Accept-Encoding": "gzip, deflate, br",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Connection": "keep-alive",
        "Content-Length": "15",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Cookie": f"{cookie}",
        "Host": "dig.chouti.com",
        "Origin": "https://dig.chouti.com",
        "Referer": "https://dig.chouti.com/",
        "Sec-Fetch-Mode": "cors",
        "Sec-Fetch-Site": "same-origin",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36",
        "X-Requested-With": "XMLHttpRequest"
    }

    # 点赞
    for data_id in data_id_list[:2]:
        print(data_id)
        r1 = requests.post(url=lick_url, headers=header_dict, data={"linkId": data_id})
        print(r1.text)
        time.sleep(1)

    # 自动点赞


if __name__ == '__main__':
    init()
    login()
    readinfo()
# 自动登录抽屉

5、QQ邮箱的登陆及皮肤换

自个写的值得夸!!!

from selenium import webdriver
import time
import requests
from lxml import etree

driver = webdriver.Chrome()


def log_onqq_emainl(u, p):
    driver.get("https://mail.qq.com/")
    driver.switch_to.frame("login_frame")
    driver.find_element_by_id("login_button").click()
    time.sleep(1)
    driver.find_element_by_id("u").send_keys(u)
    time.sleep(1)
    driver.find_element_by_id("p").send_keys(p)
    time.sleep(1)
    driver.find_element_by_id("login_button").click()
    time.sleep(1)
    # driver.find_element_by_id("")


def change_Skin():
    driver.get('https://mail.qq.com/cgi-bin/frame_html?sid=BjflCTPH-xhKxVk4&r=e22b51fd2e7601ad7481bbf514e05019')
    driver.find_element_by_id('changeSkin').click()
    driver.switch_to.frame("mainFrame")
    for i in driver.find_elements_by_xpath('/html/body/div[4]/div[3]/fieldset[2]/div/table/tbody/tr[1]/td/img'):
        i.click()
        time.sleep(3)

    driver.find_element_by_class_name('face4').click()
    time.sleep(3)
    driver.find_element_by_class_name('face22').click()
    time.sleep(3)
    driver.switch_to.default_content()
    driver.find_element_by_id('folder_1').click()
    time.sleep(3)
    driver.switch_to.frame("mainFrame")
    driver.find_element_by_id('ckb_selectAll').click()
    time.sleep(3)
    driver.find_element_by_id('quick_del').click()



if __name__ == '__main__':
    log_onqq_emainl('2632399409', 'zzy147258369')
    change_Skin()

6、嘿嘿!!(嘻刷刷)

import time

from selenium import webdriver
# 1.引入 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains

# 1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口
driver = webdriver.Chrome()

driver.get("https://blog.csdn.net/joyyi9?type=blog")
driver.refresh()
driver.set_window_size(1400, 600)
print(driver.window_handles)
time.sleep(2)
for j in range(3):
    for i in range(1,21):
        # elem1=driver.find_element_by_xpath('//*[@id="userSkin"]/div[2]/div/div[2]/div/div[2]/div/article[21]/a')
        elem1 = driver.find_element_by_xpath(
            '//*[@id="userSkin"]/div[2]/div/div[2]/div/div[2]/div/article[' + str(i) + ']/a')
        elem1.click()
        time.sleep(1)
        handle = driver.current_window_handle
        # 获取当前所有窗口句柄(窗口A、B)
        handles = driver.window_handles
        # 对窗口进行遍历
        for newhandle in handles:
        # 筛选新打开的窗口B
            if newhandle != handle:
            # 切换到新打开的窗口B
                driver.switch_to_window(newhandle)
                # 在新打开的窗口B中操作
                # driver.find_element_by_id('xx').click()
                # 关闭当前窗口B
                driver.close()
                # 切换回窗口A
                driver.switch_to_window(handles[0])
    time.sleep(10)

五、python课程设计

1.北京高考分数线统计分析

主要内容:
为了帮助广大考生和家长了解高考历年的录取情况,很多网站都汇总了各省市的录取控制分数线,为广大考生填报志愿提供参考。因受多种因素影响,每年的分数线或多或少会有一些变动。从网站上如(http://gaokao.xdf.cn/)上采集北京2006-2019年的信息。要求使用Python的Pandas库完成以下数据分析的任务:
① 一本文理科与二本文理科最高的分数线是多少,最低的分数线是多少,相差多少分。
② 今年与去年相比,一本文理科与二本文理科变化了多少分。
③求2006—2019年近14年每科分数线的平均值。

# 获取网上的数据
import requests
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
html = requests.get('http://gaokao.xdf.cn/201805/10784251.html')  # 要爬取的网址
table_data = pd.read_html(html.content, encoding='utf-8')  # 读取网页上的详细
data = table_data[0][4:17][[0,1, 2, 3, 4]].reset_index(drop=True)  # 提取4,17行,1234列,删除原有的index

data.columns = ['年份',"一本文科", "一本理科", "二本文科", "二本理科"]
# data.index = index_list
print(data)
data.to_csv(r'scores.csv')  # 写入csv件

df = pd.read_csv("scores.csv")
# print(df)

col=df[["年份",'一本理科','一本文科','二本理科','二本文科']]
cols=col.set_index('年份')#设置索引
print(cols)
print("一本理科的最高分数线:"+str(cols['一本理科'].max()))
print("一本理科的最低分数线:"+str(cols['一本理科'].min()))
print("一本理科的最低与最高相差分数:"+str(cols['一本理科'].max()-cols['一本理科'].min()))
print("--"*10)
print("一本文科的最高分数线:"+str(cols['一本文科'].max()))
print("一本文科的最低分数线:"+str(cols['一本文科'].min()))
print("一本文科的最低与最高相差分数:"+str(cols['一本文科'].max()-cols['一本理科'].min()))
print("--"*10)
print("二本理科的最高分数线:"+str(cols['二本理科'].max()))
print("二本理科的最低分数线:"+str(cols['二本理科'].min()))
print("二本理科的最低与最高相差分数:"+str(cols['二本理科'].max()-cols['二本理科'].min()))
print("--"*10)
print("二本文科的最高分数线:"+str(cols['二本文科'].max()))
print("二本文科的最低分数线:"+str(cols['二本文科'].min()))
print("二本文科的最低与最高相差分数:"+str(cols['二本文科'].max()-cols['二本文科'].min()))
print("+++"*10)
#第二种方法
# df1= df.groupby(['一本理科','一本文科'], as_index=False).min()
# print(df1.min()['一本理科'])
# print(df1.max()['一本理科'])


print("一本理科的平均分数线:"+str(cols['一本理科'].mean()))
print("一本文科的平均分数线:"+str(cols['一本文科'].mean()))
print("二本理科的平均分数线:"+str(cols['二本理科'].mean()))
print("二本文科的平均分数线:"+str(cols['二本文科'].mean()))


# 指定一个2*2布局的正方形画布
# 方法二:如果是在jupyter notebook里,设置下面两行才能显示中文
plt.rcParams['font.family'] = ['sans-serif']
# 如果是在 PyCharm 里,只要下面一行,上面的一行可以删除
plt.rcParams['font.sans-serif'] = ['SimHei']
fig, axes = plt.subplots(2,2,figsize=(10,10))
s1= cols.一本理科
s2=cols.一本文科
s3=cols.二本理科
s4=cols.二本文科
s1.plot(ax = axes[0][0],kind='bar',title="一本理科")
axes[0][0].set_xlabel("年份")
axes[0][0].set_ylabel("分数")
s2.plot(ax = axes[0][1],kind='bar',title="一本文科")
axes[0][1].set_xlabel("年份")
axes[0][1].set_ylabel("分数")
s3.plot(ax = axes[1][0],kind='bar',title="二本理科")
axes[1][0].set_xlabel("年份")
axes[1][0].set_ylabel("分数")
s4.plot(ax = axes[1][1],kind='bar',title="二本文科")
axes[1][1].set_xlabel("年份")
axes[1][1].set_ylabel("分数")
fig.tight_layout()
plt.show()

2.预处理地区信息

主要内容:通过网络爬虫爬取2016年北京地区和天津地区的一些统计信息,并根据不同地区整理成两个文件,分别为“北京地区信息.csv”和“天津地区信息.csv”,利用Pandas对爬取的数据进行预处理,具体任务为:
①检查重复数据,一旦发现有重复的数据,就需要将其进行删除。
②检查缺失值,为保证数据的完整性,通常会使用某个数据来填充。
③检查异常值,一旦发现数据中存在异常值,通常先要对照原始数据进一步确认,如果是错误的数据值,则直接使用正确的数值进行替换。

import pandas as pd
df = pd.read_csv("北京地区信息.csv")
# print(df)
#
# # ①检查重复数据,一旦发现有重复的数据,就需要将其进行删除。
# print(df.duplicated())#进行去重检查
# print(df.drop_duplicates())#删除重复
# print("--" * 10)
# ②检查缺失值,为保证数据的完整性,通常会使用某个数据来填充。
print(df.isnull())
# df1=df.fillna(method='pad')#用前一个数据代替NaN
# df1=df.fillna(method='bfill')#用后一个数据代替NaN,limit=1-->限制每列只能替代一个
# df1=df.fillna('missing')#用字符串代替NaN
df1 = df.fillna(df['常住人口_万人'].mean())  # 用一列的平均值或其他都可代替NaN
print(df1)
print("++_+_+_+_+_" * 7)
#③检查异常值,一旦发现数据中存在异常值,通常先要对照原始数据进一步确认,如果是错误的数据值,则直接使用正确的数值进行替换。
print(df1.describe())#描述信息
df1['行政面积_K㎡_isOutliner']=df1['行政面积_K㎡']>df1['行政面积_K㎡'].quantile(0.75)
df1['户籍人口_万人_isOutliner']=df1['户籍人口_万人']>df1['户籍人口_万人'].quantile(0.75)
df1['男性_isOutliner']=df1['男性']>df1['男性'].quantile(0.75)
df1['女性_isOutliner']=df1['女性']>df1['女性'].quantile(0.75)
df1['GDP_亿元_isOutliner']=df1['GDP_亿元']>df1['GDP_亿元'].quantile(0.75)
df1['常住人口_万人_isOutliner']=df1['常住人口_万人']>df1['常住人口_万人'].quantile(0.75)
print(df1)
#

3.运动员信息的分组与聚合

主要内容:利用爬虫技术从网站上爬取我国部分运动员信息,并整理一份运动员基本信息的统计表格,利用pandas中分组与聚合方法,将统计运动员基本信息进行归类,筛选出所有篮球运动员的基本信息,统计篮球运动员的如下几个指标:
① 统计男篮、女篮运动员的平均年龄、身高、体重。
② 统计男篮运动员年龄、身高、体重的极差值。
③ 统计男篮运动员的体质指数。

# 数据准备
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

df = pd.read_csv("运动员信息表.csv")
# print(df)
# # ①	统计男篮、女篮运动员的平均年龄、身高、体重。
# df1 = df[['年龄', '身高', '体重']].groupby(df['性别']).mean()
# print(df1)
# ②	统计男篮运动员年龄、身高、体重的极差值。
df2 = df[df['性别'] == '男'][['年龄', '身高', '体重']]
print(df2)
print("男篮运动员年龄的极差:" + str(df2['年龄'].max() - df2['年龄'].min()))
print("男篮运动员身高的极差:" + str(df2['身高'].max() - df2['身高'].min()))
print("男篮运动员体重的极差:" + str(df2['体重'].max() - df2['体重'].min()))

# 统计男篮运动员的体质指数。
# 指定一个2*2布局的正方形画布
# 方法二:如果是在jupyter notebook里,设置下面两行才能显示中文
plt.rcParams['font.family'] = ['sans-serif']
# 如果是在 PyCharm 里,只要下面一行,上面的一行可以删除
plt.rcParams['font.sans-serif'] = ['SimHei']
fig, axes = plt.subplots(2, 2, figsize=(10, 10))
s1 = df2.年龄
s2 = df2.身高
s3 = df2.体重
s1.plot(ax=axes[0][0], kind='line', title="年龄")
axes[0][0].set_ylabel("单位(年)")
s2.plot(ax=axes[0][1], kind='line', title="身高")
axes[0][1].set_ylabel("单位(cm)")
s3.plot(ax=axes[1][0], kind='line', title="体重")
axes[1][0].set_ylabel("单位(kg)")
fig.tight_layout()
plt.show()

4.可视化分析某年河北省旅游景点数据

主要内容:对于奔波于都市的人群而言,旅游是个非常不错的休闲方式,随着“互联网+”时代的到来,在线旅游更是推动了旅游行业的发展,国内的景点都开启了旅游的热潮。从网上爬取某年河北省景点的相关信息,存储到csv文件中,通过Matplotlib库对采集到的数据绘制图表辅助分析,完成以下指标:
① 用条形图显示河北省景点面积和旅客量位居前三的景点
②用饼状图显示河北省旅客量的占比哪个最多,哪个最少。

# 数据准备
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

df = pd.read_csv("风景名胜区.csv")
print(df)
df = df.set_index('名称')
df1 = df[df['省份'] == '河北'][['总面积_平方公里', '游客量_万人次']]
print(df1)

# https://blog.csdn.net/p1306252/article/details/121119290?ops_request_misc=&request_id=&biz_id=102&utm_term=pandas%E5%89%8D%E4%B8%89%E6%9C%80%E5%A4%A7&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-121119290.pc_search_insert_es_download_v2&spm=1018.2226.3001.4187
# 以城市和销售额为基准进行降序排序
df2 = df1[["总面积_平方公里"]].sort_values(by=["总面积_平方公里"], ascending=[False]).head(3)
print(df2)
df3 = df1[["游客量_万人次"]].sort_values(by=["游客量_万人次"], ascending=[False])
df4 = df3.head(3)
print(df3)

# 指定一个2*2布局的正方形画布
# 方法二:如果是在jupyter notebook里,设置下面两行才能显示中文
plt.rcParams['font.family'] = ['sans-serif']
# 如果是在 PyCharm 里,只要下面一行,上面的一行可以删除
plt.rcParams['font.sans-serif'] = ['SimHei']
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
s1 = df2.总面积_平方公里
s2 = df4.游客量_万人次
s1.plot(ax=axes[0], kind='barh', title="总面积_平方公里前三")
axes[0].set_xlabel("平方公里")
axes[0].set_ylabel("景点")
s2.plot(ax=axes[1], kind='barh', title="游客量_万人次.前三")
axes[1].set_xlabel("万人次")
axes[1].set_ylabel("景点")

fig.tight_layout()
plt.show()

fig, axes = plt.subplots(1, figsize=(10, 10))
df3.游客量_万人次.plot(ax=axes, kind='pie', title="河北省旅客量")
fig.tight_layout()
plt.show()

1.北京租房数据统计分析

主要内容:近年来随着经济的快速发展,一线城市的资源和就业机会吸引了很多外来人口,使其逐渐成为人口密集的城市之一,其中绝大多数人是以租房的形式解决居住问题,通过爬虫技术爬取链家网站中列出的租房信息(爬取结束时间为2019年9月10日),具体包括所属区域、小区名称、房屋价格、房屋面积、户型。将爬取的数据保存到“链家北京租房数据.csv”文件中,首先对数据进行读取,预处理、转换类型,以图表形式完成以下统计指标:
①统计每个区域的房源总数量,并使用热力图分析房源位置分布情况。
②使用条形图分析哪种户型的数量最多,更受欢迎。
③统计每个区域的平均租金,并结合柱状图和折线图分析各区域的房源数量和租金情况。
④统计面积区间的市场占有率,并使用饼状图绘制各区间所占的比例。

1.数据分析

# 数据准备
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

df = pd.read_csv("链家北京租房数据_new.csv")
# print(df)
# ①统计每个区域的房源总数量,并使用热力图分析房源位置分布情况。
df1 = df.drop_duplicates()  # 去重后的数据
df1 = df1.dropna()  # 删除缺失数据,并重新赋值。
# print(df1)
df2 = df1[['Num']].groupby(df['区域']).count()
print(df2)
#排序后的房源数量统计
df3 = df2.sort_values(by=['Num'], ascending=False)
print(df3)
#
#
# ②使用条形图分析哪种户型的数量最多,更受欢迎。大于50的!
df4 = df1[['Num']].groupby(df['户型']).count().sort_values(by=['Num'], ascending=True)
df4 = df4[df4['Num'].astype(float) > 50]
# print(df4)
# 指定一个2*2布局的正方形画布
# 方法二:如果是在jupyter notebook里,设置下面两行才能显示中文
plt.rcParams['font.family'] = ['sans-serif']
# 如果是在 PyCharm 里,只要下面一行,上面的一行可以删除
plt.rcParams['font.sans-serif'] = ['SimHei']
df1 = df1.set_index('户型')  # 设置索引
fig, axes = plt.subplots(1, figsize=(10, 10))
s1 = df4.Num
s1.plot(ax=axes, kind='barh', title="户型", )
axes.set_xlabel("户型数量")
axes.set_ylabel("户型种类")
fig.tight_layout()
plt.legend()
plt.show()


# ③统计每个区域的平均租金,并结合柱状图和折线图分析各区域的房源数量和租金情况。
df5 = df[['价格_元_月']].groupby(df['区域']).mean()
print(df5)
# df5=df5.set_index('区域')#设置索引
# df2=df2.set_index('区域')#设置索引

# 指定一个2*2布局的正方形画布
# 方法二:如果是在jupyter notebook里,设置下面两行才能显示中文
plt.rcParams['font.family'] = ['sans-serif']
# 如果是在 PyCharm 里,只要下面一行,上面的一行可以删除
plt.rcParams['font.sans-serif'] = ['SimHei']
fig, axes = plt.subplots(2, 2, figsize=(10, 10))
s1 = df2.Num
s2 = df2.Num
s3 = df5.价格_元_月
s4 = df5.价格_元_月
s1.plot(ax=axes[0][0], kind='bar', title="各个区域房源统计")
axes[0][0].set_xlabel("区域")
axes[0][0].set_ylabel("单位(栋)")
s2.plot(ax=axes[0][1], kind='line', title="各个区域房源统计")
axes[0][1].set_xlabel("区域")
axes[0][1].set_ylabel("单位(栋)")
s3.plot(ax=axes[1][0], kind='bar', title="各个区域平均租金统计")
axes[1][0].set_xlabel("区域")
axes[1][0].set_ylabel("单位(元/月)")
s4.plot(ax=axes[1][1], kind='line', title="各个区域平均租金统计")
axes[1][1].set_xlabel("区域")
axes[1][1].set_ylabel("单位(元/月)")
fig.tight_layout()
plt.show()


# ④统计面积区间的市场占有率,并使用饼状图绘制各区间所占的比例。
fig, axes = plt.subplots(1, figsize=(10, 10))
df6 = df[['面积']]

df_0_50 = df6[df6['面积'] < 50]
df_50_100 = df6[df6['面积'] < 100]
df_100_150 = df6[df6['面积'] < 150]
print(df_0_50.count()['面积'])
print(df_50_100.count() - df_0_50.count())
print(df_100_150.count() - df_50_100.count())
recipe_data = [df_0_50.count()['面积'], df_50_100.count()['面积'] - df_0_50.count()['面积'], df_100_150.count()['面积'] - df_50_100.count()['面积']]
recipe_labels = ['统计面积区间1-50㎡', '统计面积区间50-100㎡', '统计面积区间100-150㎡' ]
plt.rc('font', family='Youyuan', size='9')
plt.rc('axes', unicode_minus='False')
explode = [0.1, 0.2, 0]  # 每个元素的膨胀距离,这里指定了第0和第1个
fig, ax = plt.subplots()
ax.pie(recipe_data, explode=explode, labels=recipe_labels, autopct='%1.1f%%', shadow=True, startangle=0)
# autopct 精度 startangle 第1个元素的起始角位置,其他元素逆时针方向组织,shadow 是否使用阴影
ax.axis('scaled')  # 设置饼图的样式,设置为equals显示的会是圆形
plt.show()
#
#
#
# fig, ax = plt.subplots(figsize=(12, 6))
# recipe_data = [df_0_50.count()['面积'], df_50_100.count()['面积'] - df_0_50.count()['面积'], df_100_150.count()['面积'] - df_50_100.count()['面积']]
# recipe_labels = ['统计面积区间1-50㎡', '统计面积区间50-100㎡', '统计面积区间100-150㎡' ]
# # 用来规定输出格式的函数
# def func(pct, allvals):
#     absolute = int(pct/100.*np.sum(allvals))
#     return "{:.1f}%\n({:d})".format(pct, absolute)
# # 颜色列表
# colors=['#06799f', '#4c8e9e','#3aaacf']
# wedges, texts, autotexts = ax.pie(x=recipe_data,
#                                   labels=recipe_labels,
#                                   # autopct='%1.1f%%',   autopct后面跟的两种形式  这种格式就是 像12.3%的百分比一位小数
#                                   autopct=lambda pct: func(pct ,recipe_data),
#                                   explode=explode,
#                                   colors=colors,
#                                   pctdistance=0.7,
#                                   textprops=dict(color="w"),  # 设置白色会看不到圆外部的文字(背景是白色)
#                                   # 设置环的比例占一半
#                                   wedgeprops = {'width': 0.5, 'linewidth': 1, 'edgecolor':'w'}
#                                   )
# # 设置图例中的一些属性
# ax.legend(wedges, recipe_labels,
#           title="legends",
#           title_fontsize=15,
#           fontsize=17,
#           loc="center left",
#           bbox_to_anchor=(1, 0, 0.5, 1))
# plt.setp(autotexts, size=12, weight="bold")    # 文字的大小之类
# ax.set_title("Pie Chart", fontdict={'fontsize':15, 'fontweight':15})
# plt.show()

2.热力图

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
    <script type="text/javascript"
            src="http://api.map.baidu.com/api?v=2.0&ak=Ls5WVYwsLLtCobV9oWaGO7Triqehi9P0"></script>
    <script type="text/javascript" src="http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js"></script>
    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">
    </script>
    <title>热力图功能示例</title>
    <style type="text/css">
        ul, li {
            list-style: none;
            margin: 0;
            padding: 0;
            float: left;
        }

        html {
            height: 100%
        }

        body {
            height: 100%;
            margin: 0px;
            padding: 0px;
            font-family: "微软雅黑";
        }

        #container {
            height: 500px;
            width: 100%;
        }

        #r-result {
            width: 100%;
        }
    </style>
</head>
<body>
<div id="container"></div>
<div id="r-result">
    上传文件:<input type="file" name="file" multiple id="fileid">
    <button type="submit" id="btn" name="btn" onclick="check()">提交</button>
    <input type="button" onclick="openHeatmap();" value="显示热力图"/>
    <input type="button" onclick="closeHeatmap();" value="关闭热力图"/>
</div>
</body>
</html>
<script type="text/javascript">
    // 创建地图实例
    var map = new BMap.Map("container");
    //设置地图的中心点
    var point = new BMap.Point(116.44502461328744, 39.95413021745949);
    // 初始化地图,设置中心点坐标和地图级别
    map.centerAndZoom(point, 13);
    // 允许滚轮缩放
    map.enableScrollWheelZoom();

    var points = [];

    function check() {
        var objFile = document.getElementById("fileid");
        var files = $("#fileid").prop('files');
        console.log(files.length);
        if(files.length==0){
            alert("请选择文件")
        }else {
            for(var i=0;f=files[i];i++){
                var reader=new FileReader();
                reader.readAsText(files[i],"UTF-8");
                reader.onload=function (evt) {
                    points=jQuery.parseJSON(evt.target.result)
                    console.log(points)

                }
            }
        }
    }

    //判断浏览器是否支持canvas
    if (!isSupportCanvas()) {
        alert('热力图目前只支持有canvas支持的浏览器,您所使用的浏览器不能使用热力图功能~')
    }
    //热力图初始化
    heatmapOverlay1 = new BMapLib.HeatmapOverlay({"radius": 20});
    //地图添加热力图层
    map.addOverlay(heatmapOverlay1);
    //热力图层添加数据
    heatmapOverlay1.setDataSet({data: points, max: 100});
    //不知道作用
    //判断浏览区是否支持canvas
    function isSupportCanvas() {
        var elem = document.createElement('canvas');
        return !!(elem.getContext && elem.getContext('2d'));
    }

    //显示热力图
    function openHeatmap() {
        heatmapOverlay1.setDataSet({data:points,max:15})
        heatmapOverlay1.show();
    }

    //关闭热力图
    function closeHeatmap() {
        heatmapOverlay1.hide();
    }

    closeHeatmap();
</script>
</font>

总结

其乐无穷亦!

posted @ 2021-09-28 21:17  cactus9  阅读(145)  评论(0编辑  收藏  举报