网络数据采集实验报告
一,实验目的
网络爬虫系统的功能是下载网页数据,为搜索引擎系统或需要网络数据的企业提供数据来源。本章内容介绍了网络爬虫程序的编写方法,主要包括如何请求网页以及如何解析网页。在网页请求环节,需要注意的是,一些网站设置了反爬机制,会导致我们爬取网页失败。在网页解析环节,我们可以灵活运用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
……
绿水青山新钱景浙江村民家门口眺望诗和远方施金生(左一)正给动物喂食姚玲利摄摄中新网湖州10月11日电(施紫楠姚玲利)每天7点半,施金生来到动物园做的第一件事,就是去动物检疫场转一圈,看看动物的健康面貌,再去袋鼠的馆舍打扫
昆区青山东河九原稀土高新区最新通告昆都仑区新型冠状病毒感染肺炎防控工作指挥部通告(2022年第135号)2022年10月8日,昆都仑区在集中隔离场所应检尽检第四轮重点区域核酸检测人员中发现5名阳性人员。我区迅速采取
金牌月子餐不用请月嫂,营养师分享7天食谱,营养好吃产奶足生宝宝让人体消耗巨大,坐月子对产妇来说正是调养的好时机。月子坐得好,身体能恢复得更快,反之则容易落下病根,体质更不如前。月子餐是坐月子期间的重要一环,科学饮食充足营养能为机体的恢复
经营场所无法联系,深圳每日优鲜被列入经营异常名录新京报讯(记者张洁)10月13日,新京报记者从天眼查获悉,深圳每日优鲜电子商务有限公司因通过登记的住所或者经营场所无法联系,被深圳市市场和质量监督管理委员会南山局列入经营异常名录。
外媒美芯的寒冬开始来了在美国对华为等中企实施芯片禁令之初,比尔盖茨就曾劝告这么做适得其反,非但无法遏制中国高科技的发展,反而还会让以出口为主的美半导体市场遭到反噬,造成不可估量的损失。但杀红眼的老美显然
自己动手,丰衣足食记录生活,炼猪油。人生有很多第一次,每一个第一次对于我们来说都是一次成长,一次历练,一次蜕变。婚前只用管好自己,其他什么都不用操心,还是父母心里的小孩,结婚后,有了孩子,虽然还是父
事不三思终有悔,人能百忍则无忧老人言,句句在理,受益一生1娶妻不娶打牌女,嫁人不嫁钓鱼男2亲戚再近少往来,朋友再好不共财3君子之交淡如水,酒肉朋友莫当真4饿死不打亲戚工,穷死不耕丈人田5不怕马王三只眼,就怕人怀
海克斯科技引质疑,我们对食品添加剂是否过度焦虑了?相信大家都被最近的海克斯科技刷屏了,究竟什么是海克斯科技呢?海克斯科技的出现对于我们的生活又有什么影响?海克斯科技是什么?这个出自游戏英雄联盟的词语,特指一种魔法和科技融合的顶尖技
命里的情人,皆是有定数的人生在世命也运也布大道于天下施善念于人心虽无修行身亦是修行人洞明修行苦方开修行门众生之相诗人舒婷在她的现代诗致橡树里这样写道!我如果爱你绝不像攀援的凌霄花,借你的高枝炫耀自己我如果
阿基米德名场面新研究证实适度分心更能激发灵感说到灵光一闪,许多人脑海中浮现的,可能是阿基米德在泡澡时联想到的浮力等于排水重量。而近日发表于美学创造力和艺术心理学杂志上的一篇文章,就很好地解释了人们为何容易在浴室里放松时发散思
这样的人,非常容易得罪人!看看你是不是在中国社会,一般是先说先死。曾仕强每日箴言全文共2100字,深度阅读需6分钟,受益终生在人际交往中,有一种人总是让人又爱又恨,那就是心直口快的人。所谓,最坦诚也最傻,往往说的正是心