简单静态网页爬取

        静态网页是网站建设的基础,早期的网站基本是静态网页构成的,通常为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库识别返回的页面内容编码,并正确显示页面内容

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值