静态网页是网站建设的基础,早期的网站基本是静态网页构成的,通常为HTML格式,也可以包含一部分动态效果,如GIF格式的动画,flash,滚动字幕,该类网站的文件扩展名为.html。等。静态网页通常没有后台数据库,页面不含有程序并且无法交互。静态网页无法实时更新,更新时页面需要重新发布,通常适用于更新较少的展示型网站。
一.实现HTTP请求
使用unlib3库,requests库实现向网站发送GET类型HTTP请求并获取返回的响应。
1.unlib3
# coding: utf-8
import warnings
warnings.filterwarnings('ignore')
from urllib import request
"""请求"""
req = request.Request('http://www.zhihu.com')
"""响应"""
res = request.urlopen(req)
html = res.read()
print(html)
2.requests库
import requests
from pprint import pprint
# url
url = 'https://wis.qq.com/weather/common?source=xw&weather_type=forecast_1h|forecast_24h|index|alarm|limit|tips'
# 构造数据,requests 全系列支持字典类型的数据
payload = {
# 参考文档中的参数部分,逐一构造
'province': '四川',
'city': '成都',
'county': '武侯区'
}
# 发送 get 请求,返回结果是服务端的响应数据
r = requests.get(url, params=payload)
# 获取响应报文体
# 1.以文本方式获取报文主体
pprint(r.text)
# 2. 以字典格式获取报文主体(仅针对返回是 json 格式的数据)
pprint(r.json())
# 3. 以二进制方式获取报文主体(视频、图片等)
pprint(r.content)
二.解析网页
通过chrome开发者工具直接查看网站的页面元素,页面源码,资源详细信息,分别通过正则表达式,xpath,beautiful soup解析网页内容获取其中元素及信息。
1.使用chrome开发者工具查看网页
fn加f12 ,检查选项
2.使用正则表达式解析网页
import re
s="aaa bbb ccc ddd eee"
m=re.match(r'(.*) ccc (.*? )',s)
# 匹配整个字符串的结果
print(m.group(0))
# (.*)的结果
print(m.group(1))
# (.*? )的结果
print(m.group(2))
# 结果列表
print(m.groups())
3.使用xpath解析网页
import requests
import re
import csv
from lxml import etree
#请求网页开始
url = 'http://www.zuihaodaxue.com/Greater_China_Ranking2019_0.html'
ua = {'User-Agent':'User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'}
resp = requests.get(url,headers = ua)
print(resp.status_code)
#print(resp.text) #直接打印文本
print(resp.content.decode('utf-8')) #二进制编码 再转为utf-8编码
html = resp.content.decode('utf-8')
#请求网页结束
#解析网页开始
e_html = etree.HTML(html)
#1.提取标题
title = e_html.xpath('//title/text()')
#2.提取大学排名表
university_index = e_html.xpath('//div[@class="news-text"]//tbody/tr/td[1]/text()')
#3.提取大学名
university_name = e_html.xpath('//div[@class="news-text"]//tbody/tr/td[2]/a/div/text()')
#4.提取地区
university_location = e_html.xpath('//div[@class="news-text"]//tbody/tr/td[3]/text()')
#5.提取总分
university_score = e_html.xpath('//div[@class="news-text"]//tbody/tr/td[4]/text()')
#6 提取其他分数
university_score_other = e_html.xpath('//div[@class="news-text"]//tbody/tr/td[@class="hidden-xs"]/text()')
#解析网页结束
#保存数据开始
#存入txt文件
list_university=[]
for i in range(100):
d1 = {
'排名':university_index[i],
'大学名称':university_name[i],
'区域':university_location[i],
'总分':university_score[i],
'其他评分':university_score_other[i*7:i*7+7]
}
list_university.append(d1)
#print(list_university)
with open(r'C:\Users\HP\Desktop\university.txt','a',encoding='utf-8') as df:
for one in list_university:
df.write(json.dumps(one,ensure_ascii=False)+'\n\n')
#存入csv
#剥离其他评分
dict_university_new=[]
for i in list_university:
temp={
'排名':i['排名'],
'大学名称':i['大学名称'],
'区域':i['区域'],
'总分':i['总分'],
'研究生比例':i['其他评分'][0],
'留学生比例':i['其他评分'][1],
'师生比':i['其他评分'][2],
'博士学位授权总量':i['其他评分'][3],
'博士学位授权师均':i['其他评分'][4],
'校友获奖总量':i['其他评分'][5],
'校友获奖生均':i['其他评分'][6]
}
dict_university_new.append(temp)
with open(r'C:\Users\HP\Desktop\university.csv','a',encoding='gbk',newline='') as cf:
writer = csv.DictWriter(cf,fieldnames = ['排名','大学名称','区域','总分','研究生比例','留学生比例','师生比','博士学位授权总量','博士学位授权师均','校友获奖总量','校友获奖生均'])
writer.writeheader()
writer.writerows(dict_university_new)
#保存数据结束
4.使用Beautiful soup库解析网页
# 导入相关库
from bs4 import BeautifulSoup
import time
import requests
url_lianjia = 'https://hz.lianjia.com/ershoufang/'
headers = {#模拟浏览器请求,可以用 cookie模拟登陆状态
'User-Agent':'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
}
time.sleep(4) #延时请求
wb_data = requests.get(url_lianjia, headers=headers) #使用requests向服务器发起get请求,通过header模拟浏览器行为
soup = BeautifulSoup(wb_data.text, 'lxml') #将服务器返回的对象使用BeautifulSoup解析,wb_data为response对象,需要文本化
# 确定要抓取的元素位置
titles = soup.select('body > div.content > div.leftContent > ul > li > div.info.clear > div.title > a') #返回值类型为list
imgs = soup.select('body > div.content > div.leftContent > ul > li > a > img')
total_prices = soup.select('body > div.content > div.leftContent > ul > li > div.info.clear > div.priceInfo > div.totalPrice > span')
unit_prices = soup.select('body > div.content > div.leftContent > ul > li > div.info.clear > div.priceInfo > div.unitPrice > span')
tags = soup.select('body > div.content > div.leftContent > ul > li > div.info.clear > div.tag')
# 数据格式化,最终放到字典中
for title, img, total_price, unit_price, tag in zip(titles, imgs, total_prices, unit_prices, tags):
data = {
'title': title.get_text(),
'img': img.get('src'),
'total_price': total_price.get_text(),
'unit_price': unit_price.get_text(),
'tag': list(tag.stripped_strings)
}
print(data)
三.数据存储
使用JSON模块将XPATH获取的文本内容存储为JOSN文件,使用pymysql库将beautiful soup 库获取的标题存入MySQL数据库。
1.将数据存储为JOSN文件
1 import json
2
3 names = ['joker','joe','nacy','timi']
4
5 filename='names.json'
6 with open(filename,'w') as file_obj:
7 json.dump(names,file_obj)
["joker", "joe", "nacy", "timi"]
import json
filename='names.json'
with open(filename) as file_obj:
names = json.load(file_obj)
print(names)
2.数据库操作函数
创建数据库: create database 数据库名 【character set 字符集】
create database keeper //创建名字为keeper的数据库,character set 字符集 是规定该数据库的编码
类型,因为MySQL数据库默认都是utf8,因此后面中括号里面的内容直接可以忽略
删除数据库: drop database 数据库名
drop database keeper //删除名字为keeper的数据库
use keeper //使用数据库
训练要点
掌握使用requests库生成get请求
掌握使用requests库上传请求头中的User-Agent信息
掌握使用requests库查看返回的响应头
掌握使用requests库查看返回的状态码
掌握使用Requests库和chardet库识别返回的页面内容编码,并正确显示页面内容