2023数据采集和融合实践第一次作业

发布时间 2023-09-23 17:20:10作者: nunusu

作业①:

实验内容

题目:

  • 要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。
  • 输出信息:
    排名 学校名称 省市 学校类型 总分
    1 清华大学 北京 综合 852.5
    2 ......

代码:

import urllib.request
from bs4 import BeautifulSoup

url = "http://www.shanghairanking.cn/rankings/bcur/2020"
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, "html.parser")
print("排名\t学校名称\t省市\t类型\t总分")
for tr in soup.find('tbody').children:
    r = tr.find_all("td")
    for i in range(5):
        if i == 1:
            n = r[i].find("a").text.strip()
            print(n, end="\t")
        else:
            print(r[i].text.strip(), end="\t")
    print()

运行结果:

心得体会:

观察网页源码时发现我们所需的数据保存在tbody下td的内容中,直接爬就行。但爬第二项大学名称时会发现输出了“清华大学 Tsinghua University 双一流/985/211”,后面跟着我们不需要的内容,发现在第一个a标签下的内容只有清华大学,就只获取这一部分即可。

作业②:

实验内容:

题目:

  • 要求:用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。
  • 输出信息:
    序号 价格 商品名
    1 65.00 xxx
    2 ......

代码:

import re
def getHtml(url):
    header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.50',
              'cookie' : 'shshshfpa=5a8bccff-dc77-5e2f-7965-b4242f91b34e-1637938218; TrackID=1JTlguoTiLQvB4iGSwTgyLJTiQwYXvP--kbxpJhKJvLpH8n5TA-UJ4Mc72cS4oymQHWK6emaLq2988Th3PXi1fzwWq-nO5F1-Qp-Bo7TLz0wiowFAjhv1z5tdTn9VeYVL|||vRWEfAorskVherEWV9N26A; shshshfp=b704ec7f4eb6040223cac23ec1b36e69; areaId=16; ipLoc-djd=16-1303-0-0; PCSYCityID=CN_350000_350100_0; __jdu=1694968655458192479244; shshshfpx=5a8bccff-dc77-5e2f-7965-b4242f91b34e-1637938218; 3AB9D23F7A4B3CSS=jdd03RYBGENB6INY6GAYFFJ3PUZVZEWYHBEPZTCF7HR6PBUDKVEYXTPKKN7KM37WYR4VSXQ5ZXDA7D2MEBWZNDLLCCN2FQYAAAAMKWZ5R5JAAAAAADJYVP3H626GX7QX; _gia_d=1; shshshsID=7fff9901fdb6af97019f9f560307937f_1_1695278643007; shshshfpb=AAjs-e7aKEovM_9x3Xi95ZbQkL5GzThY3k4IYQAAAAAA; unpl=JF8EALJnNSttCxxQAEkBH0EUSVRcWwgNTR4GaDVWBFoPSwEHTwsfEhN7XlVdXxRKHx9sZxRUWFNOUQ4aBysSEXteU11bD00VB2xXXAQDGhUQR09SWEBJJV9dWVkKSxcCbWAMZG1bS2QFGjIbFRhOVVNXWgxPEgdmZw1XWF5DVwAeMhoiF3ttZFhVCk4eAl9mNVVtGh8IAB8HEhsZBl1TVlgATB4Ea2MAUFRYQ1cAHQoYFxV7XGRd; _reuuid=0b61c53b014b469ea528499e628b68db; re_mbp=CDoQ8IvM-gEaLjM4NjUzMTEwMzY4XzBfYmY1NGMyNWI1Mzg5NGQ0Nzg0NmNiYTZmMWQzZTg1MTIgAEICcmlaLjM4NjUzMTEwMzY4XzBfYmY1NGMyNWI1Mzg5NGQ0Nzg0NmNiYTZmMWQzZTg1MTI; __jda=122270672.1694968655458192479244.1694968655.1694968655.1695278637.2; __jdc=122270672; __jdv=122270672|haosou-search|t_262767352_haosousearch|cpc|38653110368_0_bf54c25b53894d47846cba6f1d3e8512|1695278648960; __jdb=122270672.3.1694968655458192479244|2.1695278637; 3AB9D23F7A4B3C9B=RYBGENB6INY6GAYFFJ3PUZVZEWYHBEPZTCF7HR6PBUDKVEYXTPKKN7KM37WYR4VSXQ5ZXDA7D2MEBWZNDLLCCN2FQY',
              'Content-Type': 'application/json'
              }
    r = requests.get(url, headers=header)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    return r.text
def getdata(html):
    print("{:4}\t{:8}\t{:16}".format("序号", "价格", "商品名称"))
    p = re.findall(r'"sku_price":"[\d\.]*"', html)  #[\d\.]匹配数字或小数点
    t = re.findall(r'"ad_title_text":".+?"',html)   #  加问号懒惰匹配,匹配到第一个"就结束了
    for i in range(len(p)):
        price = eval(p[i].split(':')[1])
        name = eval(t[i].split(':')[1])   #冒号分割,eval去引号
        print("{:4}\t{:8}\t{:16}".format(i, price, name))
if __name__ == '__main__':
    url = "https://re.jd.com/search?keyword=%E4%B9%A6%E5%8C%85&enc=utf-8
    html = getHtml(url)
    # print(html)
    getdata(html)

运行结果:

心得体会:

爬取京东中“书包”的商品数据,用requests返回json类的数据,输出返回的数据观察发现里面"sku_price"存的值是价格,"ad_title_text"存的值是商品名称,用re匹配这部分并用split切割出具体值。

作业③:

实验内容:

题目:

  • 要求:爬取一个给定网页( https://xcb.fzu.edu.cn/info/1071/4481.htm )或者自选网页的所有JPEG和JPG格式文件
  • 输出信息:将自选网页内的所有JPEG和JPG文件保存在一个文件夹中

代码:

import urllib.request
import requests, os
from bs4 import BeautifulSoup
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.50',
}
url = "https://xcb.fzu.edu.cn/info/1071/4481.htm"
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, "html.parser")

if not os.path.exists('./pictures'):
    os.mkdir('./pictures')
for p in soup.find_all("p", attrs={"class": "vsbcontent_img"}):
    path = str(p).split(" ")[2].split("\"")[1]

    detail_url = 'https://xcb.fzu.edu.cn/' + path
    detail_name = path.split("/")[-1].split("?")[0]
    detail_path = './pictures/' + detail_name
    detail_data = requests.get(url=detail_url, headers=headers).content

    with open(detail_path, 'wb') as fp:
        fp.write(detail_data)
        print(detail_name, 'seccess!!')

运行结果:


心得体会:

写代码的时候没想到可以直接搜索"img",而是搜索了img的上一级"p",然后繁琐的把图片的路径分割出来。不过结果一样都是得到图片的路径。点开图片详情页发现图片路径不只我们得到的部分路径,前面还要加上'https://xcb.fzu.edu.cn/'。