2023数据采集与融合技术实践作业一
作业1
实验要求
要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。
输出信息:
排名 学校名称 省市 学校类型 总分
1 清华大学 北京 综合 852.5
2......
作业内容
import requests
import urllib.request
from bs4 import BeautifulSoup
import bs4
def main():
uinfo = []
url = "https://www.shanghairanking.cn/rankings/bcur/2020"
try:
res = requests.get(url)
res.raise_for_status()
res.encoding = res.apparent_encoding
html = res.text
except Exception as err:
print(err)
try:
req = urllib.request.Request(url)
html = urllib.request.urlopen(req).read.decode()
except Exception as err:
print(err)
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
a = tr('a')
tds = tr('td')
uinfo.append([tds[0].text.strip(), a[0].string.strip(), tds[2].text.strip(), tds[3].text.strip(), tds[4].text.strip()])
tplt = "{0:^10}\t{1:^10}\t{2:^12}\t{3:^12}\t{4:^10}"
print(tplt.format("排名", "学校名称", "省份", "学校类型", "总分"))
for i in range(30):
u = uinfo[i]
print(tplt.format(u[0], u[1], u[2], u[3], u[4]))
if __name__ == '__main__':
main()
心得体会
主要是bs4+request的使用爬取排名网站,没有什么反爬虫的机制,代码运行的速度也很快
作业2
实验要求
要求:用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。
输出信息:
序号 价格 商品名
1 65.00 xxx
2......
作业内容
import re
import urllib3
# 创建urllib3的PoolManager对象
http = urllib3.PoolManager()
# 定义要爬取的页面URL
url = "https://s.taobao.com/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306"
# 发起请求,获取页面内容
response = http.request('GET', url)
html = response.data.decode('utf-8')
# 将页面内容写入本地静态HTML文件
with open('taobao_page.html', 'w', encoding='utf-8') as f:
f.write(html)
# 使用正则表达式提取商品名称和价格
# 商品名称的正则表达式
item_name_pattern = r'"title":"(.*?)"'
# 商品价格的正则表达式
item_price_pattern = r'"price":"(.*?)"'
# 提取商品名称和价格
item_names = re.findall(item_name_pattern, html)
item_prices = re.findall(item_price_pattern, html)
# 打印商品名称和价格
for name, price in zip(item_names, item_prices):
print(f'商品名称: {name}, 价格: {price}')
心得体会
1.对于淘宝网,可以手动保存页面为本地静态页面,之后就好解决了
2.可能是浏览器的原因,用2345右击保存的静态页面什么内容也没有,用Chrome的插件Save Page保存就可以
作业3
实验要求
要求:爬取一个给定网页( https://xcb.fzu.edu.cn/info/1071/4481.htm)或者自选网页的所有JPEG和JPG格式文件
输出信息:将自选网页内的所有JPEG和JPG文件保存在一个文件夹中
作业内容
import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse
# 定义要爬取的网页URL
url = "https://xcb.fzu.edu.cn/info/1071/4481.htm"
# 创建一个文件夹来保存图片
folder_path = "images"
if not os.path.exists(folder_path):
os.makedirs(folder_path)
# 获取网页的HTML内容
response = requests.get(url)
html_content = response.text
# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(html_content, "html.parser")
# 找到所有的img标签,并筛选出JPEG和JPG文件
img_tags = soup.find_all("img")
image_urls = []
for img in img_tags:
src = img.get("src")
if src and src.endswith((".jpeg", ".jpg")):
# 使用urlparse检查并修正URL的协议
url_parts = urlparse(src)
if not url_parts.scheme:
# 如果协议不存在,添加默认的http://协议
src = "https://xcb.fzu.edu.cn" + src
image_urls.append(src)
# 下载图片并保存到文件夹中
for i, image_url in enumerate(image_urls):
image_response = requests.get(image_url)
image_name = f"{i}.jpeg" # 简单的命名规则,可以根据需要修改
image_path = os.path.join(folder_path, image_name)
with open(image_path, "wb") as f:
f.write(image_response.content)
心得体会
1.过程出现了一个问题:图片的url报错,显示协议头不正确,之后我手动加上https://xcb.fzu.edu.cn的头部,解决了这个问题
2.可以通过导入urllib.parse,筛选带有jpg,jpeg的数据并检查url,如果没有https://的头部,则要加上
3.图片下载的过程非常缓慢,不知道是什么原因。。。