2024数据采集与融合实践作业一
码云链接:gitee码云
作业①:
1)、爬取学校排名实验:
o 要求:用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。
o 输出信息:
排名 | 学校名称 | 省市 | 学校类型 | 总分 |
---|---|---|---|---|
1 | 清华大学 | 北京 | 综合 | 852.5 |
2...... | ||||
代码: |
#爬取学校排名信息
import sqlite3
import requests
from bs4 import BeautifulSoup
url=r'http://www.shanghairanking.cn/rankings/bcur/2020'
req = None
try:
req = requests.get(url)
req.raise_for_status()
req.encoding=req.apparent_encoding
except:
print("error im request")
data=req.text
#解析数据
soup=BeautifulSoup(data,'lxml')
tbody_tag=soup.find('tbody')
school_tags=tbody_tag.find_all('tr')
#使用sqlite存储数据
conn = sqlite3.connect('result1.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS school (
rank INTEGER PRIMARY KEY,
name TEXT NOT NULL,
city TEXT NOT NULL,
type TEXT NOT NULL,
point DOUBLE NOT NULL
)
''')
for school_tag in school_tags:
i=0
for value_tag in school_tag.find_all('td'):
if i==0:
rank=value_tag.find('div').text
if i==1:
my_name=value_tag.find('span',attrs={'class':'name-cn'}).text
if i==2:
city=value_tag.text
if i==3:
type_school=value_tag.text
if i==4:
point=value_tag.text
i+=1
print(rank.strip(), my_name.strip(), city.strip(), type_school.strip(), point.strip(), sep='\t')
cursor.execute("INSERT INTO school VALUES (?, ?, ?, ?, ?)", (rank.strip(), my_name.strip(), city.strip(), type_school.strip(), point.strip()))
# 提交事务
conn.commit()
# 关闭游标和连接
cursor.close()
conn.close()
2)、心得体会
通过这个实验我初步练习了beatifulsoup的find_all功能,学会了request请求页面信息和解析页面信息
作业②:
1)
o 要求:用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。
o 输出信息:
序号 | 价格 | 商品名 |
---|---|---|
1 | 65.00 | xxx |
2...... | ||
代码 |
#爬取商城价格信息
import requests
import re
import sqlite3
#使用sqlite存储数据
conn = sqlite3.connect('result1.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS mail (
id INTEGER PRIMARY KEY,
price DOUBLE NOT NULL ,
name TEXT NOT NULL
)
''')
#request获取网页数据
url=r'http://search.dangdang.com/?key=%CA%E9%B0%FC&act=input'
req = None
try:
req = requests.get(url)
req.raise_for_status()
req.encoding=req.apparent_encoding
except:
print("error im request")
data=req.text
#获取商品信息部分数据(在<ul></ul>)里
match=re.search('''<ul class="bigimg cloth_shoplist" id="component_59">.*</ul''',data)
#start,end分别匹配每一件商品信息的开头和结尾(单件商品信息在<li></li>里)
data=data[match.start():match.end()]
start=re.search('<li',data)
end=re.search('</li',data)
i=0
while end!=None:
#获取单件商品的信息my_data
my_data=data[start.end():end.start()]
#获取商品的price
price_sta_match=re.search('<span class="price_n">',my_data)
price_end_match=re.search('</span>',my_data)
price=my_data[price_sta_match.end()+5:price_end_match.start()]
#获取商品name
title_match=re.search('title="',my_data)
ddclick_match=re.search('ddclick',my_data)
name=my_data[title_match.end():ddclick_match.start()].strip()
name=name[:-1]
#输出编号,price,name并存进数据库
print(i,price,name,sep='\t')
cursor.execute("INSERT INTO mail VALUES (?, ?, ?)",(i, price, name))
# 更新遍历的数据(data-my_data)
data=data[end.end():]
#找下一个商品信息
start = re.search('<li', data)
end = re.search('</li', data)
i+=1
# 提交事务
conn.commit()
# 关闭游标和连接
cursor.close()
conn.close()
2)心得体会
这个实验练习了re库和request的使用,其中我想使用更为简洁的表达式,但是总是不成功各种问题,只好使用比较笨的方法,分成两部分查找,正则表达式掌握的好感觉可以事半功倍,大大提高解析html文档的水平
作业③:
o 要求:爬取一个给定网页( https://news.fzu.edu.cn/yxfd.htm)或者自选网页的所有JPEG和JPG格式文件
o 输出信息:将自选网页内的所有JPEG和JPG文件保存在一个文件夹中
代码
#下载图片
import requests
from bs4 import BeautifulSoup
import os.path as path
import re
import sqlite3
#使用sqlite存储数据
conn = sqlite3.connect('result2.db')
cursor = conn.cursor()
cursor.execute('''
DROP TABLE IF EXISTS pic
''')
cursor.execute('''
CREATE TABLE IF NOT EXISTS pic (
id INTEGER PRIMARY KEY,
url TEXT NOT NULL ,
suffix TEXT NOT NULL,
picture BLOB
)
''')
#根据img_src把对应图片下载到C:\Users\supermejane\Desktop\爬虫实践\实践一\images文件夹
def downlord(url):
global cnt
img_path=path.join(my_path,str(cnt))
index=re.search(r'\.(?=[^.]*$)',url).start()
print(len(url),index)
#ext为对应扩展名jpg,jpeg
ext=url[index:]
print(ext)
req = requests.get(url)
req.raise_for_status()
data=req.content
with open(img_path+ext,'wb') as file:
file.write(data)
print(str(cnt)+ext)
cursor.execute("INSERT INTO pic VALUES (?, ?, ?, ?)",
(cnt, url, ext, sqlite3.Binary(data)))
cnt+=1
if '__main__'==__name__:
#获取给定网站html信息data
url = r'https://news.fzu.edu.cn/yxfd.htm'
req = None
try:
req = requests.get(url)
req.raise_for_status()
req.encoding = req.apparent_encoding
except:
print("error im request")
data = req.text
#存储路径my_path和图片名cnt
my_path = r'C:\Users\supermejane\Desktop\爬虫实践\实践一\images'
cnt=0
#提取img标签的src属性,并且下载
soup = BeautifulSoup(data, 'lxml')
img_tags = soup.find_all('img')
for img_tag in img_tags:
src = img_tag['src']
print(r'https://news.fzu.edu.cn/'+src)
downlord(r'https://news.fzu.edu.cn/'+src)
# 提交事务
conn.commit()
# 关闭游标和连接
cursor.close()
conn.close()
2)心得体会
这个实验主要是练习了下下载二进制文件,req.content获得数据