网络数据采集实验报告
一,实验目的
网络爬虫系统的功能是下载网页数据,为搜索引擎系统或需要网络数据的企业提供数据来源。本章内容介绍了网络爬虫程序的编写方法,主要包括如何请求网页以及如何解析网页。在网页请求环节,需要注意的是,一些网站设置了反爬机制,会导致我们爬取网页失败。在网页解析环节,我们可以灵活运用BeautifulSoup提供的各种方法获取我们需要的数据。同时,为了减少程序开发工作量,可以选择包括Scrapy在内的一些网络爬虫开发框架编写网络网络爬虫程序。
二,实验要求
1.1 采集网页数据保存到文本文件
访问古诗文网站(https://so.gushiwen.org/mingju/),会显示如图3-5所示的页面,里面包含了很多名句,点击某一个名句(比如"山有木兮木有枝,心悦君兮君不知"),就会出现完整的古诗(如图3-6所示)
1.2 采集网页数据保存到MySQL数据库
编写网络爬虫程序,读取网页内容进行解析,并把解析后的数据保存到MySQL数据库中,
1.3 XPath语言
了解Xpath的基本术语及语法
三,实验步骤
1.1 采集网页数据保存到文本文件
下面编写网络爬虫程序,爬取名句页面的内容,保存到一个文本文件中,然后,再爬取每个名句的完整古诗页面,把完整古诗保存到一个文本文件中。可以打开一个浏览器,访问要爬取的网页,然后在浏览器中查看网页源代码,找到诗句内容所在的位置,总结出它们共同的特征,就可以将它们全部提取出来了。
import requests
from bs4 import BeautifulSoup
import time
#函数1:请求网页
def page_request(url,ua):
response = requests.get(url,headers = ua)
html = response.content.decode("utf-8")
return html
#函数2:解析网页
def page_parse(html):
soup = BeautifulSoup(html,"html.parser")
title = soup("title")
sentence = soup.select("p.left > p.sons > p.cont > a:nth-of-type(1)")
poet = soup.select("p.left > p.sons > p.cont > a:nth-of-type(2)")
sentence_list=[]
href_list=[]
for i in range(len(sentence)):
temp = sentence[i].get_text()+ "---"+poet[i].get_text()
sentence_list.append(temp)
href = sentence[i].get("href")
href_list.append("https://so.gushiwen.org"+href)
return [href_list,sentence_list]
#函数3:写入文本文件
def save_txt(info_list):
import json
with open(r"D:sentence.txt","a",encoding="utf-8") as txt_file:
for element in info_list[1]:
txt_file.write(json.dumps(element,ensure_ascii=False)+" ")
#子网页处理函数:进入并解析子网页/请求子网页
def sub_page_request(info_list):
subpage_urls = info_list[0]
ua = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"}
sub_html = []
for url in subpage_urls:
html = page_request(url,ua)
sub_html.append(html)
return sub_html
#子网页处理函数:解析子网页,爬取诗句内容
def sub_page_parse(sub_html):
poem_list=[]
for html in sub_html:
soup = BeautifulSoup(html,"html.parser")
poem = soup.select("p.left > p.sons > p.cont > p.contson")
poem = poem[0].get_text()
poem_list.append(poem.strip())
return poem_list
#子网页处理函数:保存诗句到txt
def sub_page_save(poem_list):
import json
with open(r"D:poems.txt","a",encoding="utf-8") as txt_file:
for element in poem_list:
txt_file.write(json.dumps(element,ensure_ascii=False)+" ")
if __name__ == "__main__":
print("****************开始爬取古诗文网站******************")
ua = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"}
for i in range(1,4):
url = "https://so.gushiwen.org/mingju/default.aspx?p=%d&c=&t="%(i)
time.sleep(1)
html = page_request(url,ua)
info_list = page_parse(html)
save_txt(info_list)
#处理子网页
print("开始解析第%d"%(i)+"页")
#开始解析名句子网页
sub_html = sub_page_request(info_list)
poem_list = sub_page_parse(sub_html)
sub_page_save(poem_list)
print("******************爬取完成*********************")
print("共爬取%d"%(i*50)+"个古诗词名句,保存在如下路径:D:sentence.txt")
print("共爬取%d"%(i*50)+"个古诗词,保存在如下路径:D:poem.txt")
1.爬取1到9页的古诗
2.在D盘新建poem.txt和sentence.txt
3.如图爬取文件内容
# html_to_
mysql.py
import requests
from bs4 import BeautifulSoup
from pymysql import connect
# 读取本地HTML文件
def get_html():
path = "E:专业课数据采集与预处理day05webo_demo.html"
htmlfile = open(path, "r+",encoding="utf-8")
html = htmlfile.read()
return html
def parse_html(html):
soup = BeautifulSoup(html,"html.parser")
all_tr=soup.find_all("tr")[1:]
all_tr_list = []
info_list = []
for i in range(len(all_tr)):
all_tr_list.append(all_tr[i])
for element in all_tr_list:
all_td=element.find_all("td")
all_td_list = []
for j in range(len(all_td)):
all_td_list.append(all_td[j].string)
info_list.append(all_td_list)
return info_list
# 保存数据库
def save_mysql(info_list):
import pymysql.cursors
# 连接数据库
connect = pymysql.Connect(
host="localhost",
port=3306,
user="root", # 数据库用户名
passwd="Lcj171011", # 密码
db="webab",
charset="utf8"
)
# 获取游标
cursor = connect.cursor()
for item in info_list:
id = int(item[0])
keyword = item[1]
number = int(item[2])
sql = "INSERT INTO search_index(id,keyword,number) VALUES ("%d", "%s", %d)"
data = (id, keyword, number)
cursor.execute(sql % data)
connect.commit()
print("成功插入数据")
# 关闭数据库连接
connect.close()
if __name__ =="__main__":
html = get_html()
info_list = parse_html(html)
save_mysql(info_list)
1.2 采集网页数据保存到MySQL数据库
由于很多网站设计了反爬机制,会导致爬取网页失败,因此,这里直接采集一个本地网页文件web_demo.html,它记录了不同关键词的搜索次数排名,其内容如下:
import requests
from bs4 import BeautifulSoup
from pymysql import connect
# 读取本地HTML文件
def get_html():
path = "E:专业课数据采集与预处理day05webo_demo.html"
htmlfile = open(path, "r+",encoding="utf-8")
html = htmlfile.read()
return html
def parse_html(html):
soup = BeautifulSoup(html,"html.parser")
all_tr=soup.find_all("tr")[1:]
all_tr_list = []
info_list = []
for i in range(len(all_tr)):
all_tr_list.append(all_tr[i])
for element in all_tr_list:
all_td=element.find_all("td")
all_td_list = []
for j in range(len(all_td)):
all_td_list.append(all_td[j].string)
info_list.append(all_td_list)
return info_list
# 保存数据库
def save_mysql(info_list):
import pymysql.cursors
# 连接数据库
connect = pymysql.Connect(
host="localhost",
port=3306,
user="root", # 数据库用户名
passwd="Lcj171011", # 密码
db="webab",
charset="utf8"
)
# 获取游标
cursor = connect.cursor()
for item in info_list:
id = int(item[0])
keyword = item[1]
number = int(item[2])
sql = "INSERT INTO search_index(id,keyword,number) VALUES ("%d", "%s", %d)"
data = (id, keyword, number)
cursor.execute(sql % data)
connect.commit()
print("成功插入数据")
# 关闭数据库连接
connect.close()
if __name__ =="__main__":
html = get_html()
info_list = parse_html(html)
save_mysql(info_list)
1.3 XPath语言
XML文档通常可以被看作一棵节点树。在XML中,有元素、属性、文本、命名空间、处理指令、注释以及文档节点等七种类型的节点,其中,元素节点是最常用的节点。下面是一个HTML文档中的代码:
html_text = """
BigData Software
BigData Software
There are three famous bigdata software;and their names are
Hadoop,
Sparkand
;
and they are widely used in real application.
others
……
今日,ST海航摘帽了!但后续又会如何呢?今日,原ST海航成功摘帽,方老板也对广大股民和海航的员工兑现了诺言!撒花不久前方老板曾说过,会向国务院申请,就海航财务经营状况做特殊处理,以保证海航航空股票能在今年摘帽,否则这家上
当下的救市政策与过去有什么不同?在老百姓刚经历了13年开启,1517年席卷全国的房价翻倍上涨的历程,内心建立起北上广深永远涨的理念后,这个理念就遭遇了疫情后房地产市场量价齐跌现实的迎头痛击。房子不好卖了,直接带来
建艺集团遭自己人告了被指拖欠8000万每经记者曾剑每经编辑董兴生装修行业上市公司建艺集团(SZ002789,股价17。22元,市值27。49亿元)竟然被自己人给告了。9月28日晚间,建艺集团披露,自然人王子森作为原告,
预测钢材到底还能涨多少今日看点基准价格走势原料市场动态部分市场调研期货市场分析重点市场消息一hr各品种今日基准价格走势二hr原料动态钢坯29日唐山钢坯库存总计42。25万吨,较昨减少0。38万吨,其中海
红米百元机重出江湖普及5G手机而来9月29日消息,Redmi红米手机宣布,Redmi千元小金刚再添猛将,Note11R为普及5G手机疾速而来。简单说,小米推出了Note11R,虽然说定价千元,但随着双11到来,未来
东莞最高峰银瓶山,爬山全程分享,惠州仲恺东莞谢岗镇时间20220927星期二地点惠州仲恺东莞谢岗镇,银瓶山。人物单人事情骑行爬山爬升高度1012m运动公里数61。59公里(骑行46公里,爬山15。59公里)全程总用时11小时49分
八达岭长城要爬多久,需要几个小时?八达岭长城一日游攻略来北京真的不要来八达岭长城吗?八达岭长城巍峨雄壮,绵延不尽,登上长城极目远眺,万里长城犹如一条巨龙,飞舞在山岭间。如果能够亲眼见万里长城,感受身为华夏儿女的自豪,那种感觉太震撼了,
易图通成为交通运输部首批智能交通先导应用试点项目服务商近日,公司旗下易图通通过中国交通运输部审批,成为首批智能交通先导应用试点项目(自动驾驶和智能航运方向)服务商,通过开展开放道路车路协同干线物流自动驾驶先导应用试点,形成技术指南以及
挚研宏微光伏产业,从夹缝生存到扎根黄土高原富煤贫油这一能源储量特征,深深影响了我国发电产业的发展。近年来,碳中和成为国际环保领域的共识,光伏发电凭借其高效环保经济等特点,在动力源迭代中逐渐坐稳了位置,今天,对外市场屡遭黯淡
吹爆这4条自驾游线路,我愿称它7天旅行天花板墙裂推荐,非常适合一周左右的国庆假期,线路信息基于原厂房车俱乐部及车主的实地考察,通行条件可能会发生改变,仅供参考。Route1甘肃内蒙环线途径点兰州,金昌,巴丹吉林镇,额济纳旗,
潍坊动力一座盛产冠军企业的城市编者按潍坊国际风筝节和寿光蔬菜可谓是大名鼎鼎,但论及这座城市的工业实力,外界很多人并不清楚。事实上,潍坊拥有国家级制造业单项冠军企业17家,山东省级单项冠军则有123家。值得一提的