2023数据采集与融合技术实践作业一

作业1

  • 要求

用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。

  • 输出信息

image

Code
from bs4 import BeautifulSoup
from bs4 import UnicodeDammit
import urllib.request
from prettytable import PrettyTable
import importlib, sys
importlib.reload(sys)

url="http://www.shanghairanking.cn/rankings/bcur/2023"

req=urllib.request.Request(url)

data=urllib.request.urlopen(req)

data=data.read()

dammit=UnicodeDammit(data,["utf-8","gbk"])

data=dammit.unicode_markup

soup=BeautifulSoup(data,"html.parser")

List=soup.select("tbody tr")

table = PrettyTable(['排名','学校名称_102102103liyishui','省市','学校类型','总分'])
#由于返回的学校名称都是这种类型:清华大学TsinghuaUniversity双一流/985/211
#写一个函数把xx大学这个子串拎出来
def extract_name(school_info):
  uni_idx = school_info.find('大学')
  name = school_info[:uni_idx+2]
  return name

for item in List[0:10]:
    ls=item.select("td")
    length=len(ls)
    cnt=0
    school=[]
    for i in ls[0:5]:
        cnt+=1
        text = i.text.replace(" ", "").replace("\n", "")
        school.append(text)
    #制成表格更清晰,用制表符的话有很多格式对齐问题,有点丑。
    table.add_row([school[0], extract_name(school[1]),school[2], school[3], school[4]]);
print(table)
结果:

image

心得体会:这次作业遇到的最大困难是提取名字的时候都是这个格式:清华大学TsinghuaUniversity双一流/985/211,显然学校名称没有这么长。。就写了个函数把名字提取出来,具体地,只要截取以"大学"为结尾的前缀即可。

遇到的第二个问题是不太会用制表符,硬对着输出调也感觉好丑,干脆学了一下怎么用python的table库,丢到table里再把table打出来。好看!舒服!

作业2

  • 要求

用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。

  • 输出信息

image

Code
### 爬书包

import requests
from bs4 import BeautifulSoup


def getText(url):
    try:
        kv = {'user-agent': 'Mozilla/5.0',
              'Cookie': 'shshshfpa=e3e89d97-c9a2-c2e9-6e64-45d70b6d67a9-1645440655; shshshfp=ad09f4fb9e45d983852b1910886403fd; __jdu=1681212098092903746838; _pst=jd_49d56a527ca9d; unick=jd_49d56a527ca9d; pin=jd_49d56a527ca9d; _tp=ruGmgLmcc2ms32n%2Fd2xUNr5FSr8%2B86Heqp8Pjph3kE4%3D; areaId=16; ipLoc-djd=16-1341-3499-44887; shshshfpx=e3e89d97-c9a2-c2e9-6e64-45d70b6d67a9-1645440655; qrsc=3; rkv=1.0; pinId=SQ3owyCiM5CmkFe8hfBzp7V9-x-f3wj7; unpl=JF8EAJRnNSttDBlQAhMHThQXTFpcWw5YHERROjcMAV9RQlwAHwMTQhR7XlVdXxRKHx9sZxRUWVNJVQ4aAysSEXtdVV9cCUoVBGxjNRQdBABkNRgCKxIRe11TV10LSxQCZ24EXF5QSlYDHgUSEBl7XGRZbTh7FjNuVwRkFjZKGQUcCxsREEhcXFdcAEgfAm1hAFNUWkJkBCsB; __jdv=76161171|cn.bing.com|t_1000003625_qqmz|tuiguang|ec5694d766694bafbcda8d38894509a5|1695281401655; PCSYCityID=CN_350000_350100_0; jsavif=0; jsavif=0; __jda=122270672.1681212098092903746838.1681212098.1694962011.1695281402.6; __jdc=122270672; mba_muid=1681212098092903746838; logintype=wx; npin=jd_49d56a527ca9d; wlfstk_smdl=yd1b6nege3o7l87uvi1qaeeqv4kiirsg; thor=121EC429CE7A1DBFF4598E22D366AC9BEA9BE8C45ED022D022CEF17750DD126134D8ECE3B3D5E47816BB2E3CCB86555D9F8F1514454163E383BE008B55A681AD12E33B028F1A35F98C9E7239650D4C04A49AC2A534E0EB2134EE0A37B6840805B8D5C62D848ECF2238A8D10783853D24B0F810E74117C03E59A9DF6E16888A691EADEB328FDE3FD0F05887AACB6ACAB10B6D5652F94EC3503C161FE449E473DC; flash=2_IgkLQqg75pyA0X7FJhHvwYJYLet6Z81R370yk-qugFRaOz5Cw1BfpCHN1nnmAr7Pqs7hruykk5k72aHowLJPnraxGVIGZITIWzR7Qi9An75*; 3AB9D23F7A4B3CSS=jdd03R4EDB26KTYAUEHPIYITJCBDXRW54MUONJKNXW66DLU5A6RBROWBSHT5E4ELD665Z2PMZBLEGLXYON76357UCXSH6MMAAAAMKW3A4ENQAAAAACKHGL4ZIJWRKXIX; _gia_d=1; xapieid=jdd03R4EDB26KTYAUEHPIYITJCBDXRW54MUONJKNXW66DLU5A6RBROWBSHT5E4ELD665Z2PMZBLEGLXYON76357UCXSH6MMAAAAMKW3A4ENQAAAAACKHGL4ZIJWRKXIX; __jdb=122270672.9.1681212098092903746838|6.1695281402; shshshsID=54bc68d2e1f39e9d26af4bdfbd24daaf_6_1695283294251; shshshfpb=AAiQ4wraKEuidl8miwuluZEXXC21nqRZFRAZVSQAAAAA; 3AB9D23F7A4B3C9B=R4EDB26KTYAUEHPIYITJCBDXRW54MUONJKNXW66DLU5A6RBROWBSHT5E4ELD665Z2PMZBLEGLXYON76357UCXSH6MM'}
        r = requests.get(url, headers=kv, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

global count
count=0

def parsePage(ilt, html):
    global count
    soup = BeautifulSoup(html, "html.parser")
    plt = soup.find_all('div', class_='p-price')  # 价钱所在的div的class标签为“p-price"
    tlt = soup.find_all('div', class_='p-name')  # 价钱所在的div的class标签为“p-name p-name-type-2"
    for i in range(min(len(plt),10)):
        price = plt[i]('i')
        title = tlt[i]('em')
        count+=1
        print("{:^4}\t{:^8}\t{:^16}".format(count, price[0].get_text(), title[0].get_text()))
        ilt.append([price[0].get_text(), ])

def run():
    goods = "书包"
    depth = 2
    start_url = "https://search.jd.com/Search?keyword=" + goods
    infoList = []
    print("{:^4}\t{:^8}\t{:^16}".format("序号", "价格", "商品名"))
    for i in range(depth):
        url = start_url + '&s=' + str(44*i)
        html = getText(url)
        #print(html)
        parsePage(infoList, html)

run()

结果:
image

心得体会:这次作业遇到的最大困难是爬的时候发现返回的列表都是空的,说明我根本就没有登上去。最后解决方案是登录京东->F12->网络->Doc->查看自己的cookie->添加到请求头里面去(也是我代码里面的kv)。

对beautifsoup的find_all有了新的使用体会,好好用

作业3

  • 要求

爬取一个给定网页( https://xcb.fzu.edu.cn/info/1071/4481.htm)或者自选网页的所有JPEG和JPG格式文件

  • 输出信息

输出信息:将自选网页内的所有JPEG和JPG文件保存在一个文件夹中

Code
### 爬取福大新闻网作业

import requests
import urllib.request
from bs4 import BeautifulSoup

def getMoviesImg():
    url = requests.get('https://xcb.fzu.edu.cn/info/1071/4481.htm')
    #获取网站数据
    html = url.text
    #解析网页
    soup = BeautifulSoup(html,'html.parser')
    #获取所有的img标签
    movie = soup.find_all('img')
    x = 1
    print(movie)
    for i in movie:
        # 获取src路径
        imgsrc = i.get('src')
        #判断图片src路径是否以指定内容开头(过滤页面中的其它不想要的图片)
        filename = 'D:/cray_download/%s.jpg'%x
        #将URL表示的网络对象复制到本地文件
        imgsrc='https://xcb.fzu.edu.cn/'+imgsrc
        print(imgsrc)
        urllib.request.urlretrieve(imgsrc , filename)
        print('下载第%d张' % x)
        x += 1
    print('**下载完成!**')

getMoviesImg()

结果:

image

image

心得体会:这次作业完成得比较轻松,因为这个网站构成很简单,并且所有的图片都是jpg(除了相应我的请求慢了一点以外)。所以直接find_all。

遇到的一个小问题是get出来的imgsrc并不能直接用,都长这种格式:
__local/3/B4/9F/FB5989AAE9881E0EDB3B42F01F7_908A13A6_8426D.jpeg?e=.jpeg

返回原网站,对图片右键->检查,发现人家的源链接其实是:
https://xcb.fzu.edu.cn//__local/3/B4/9F/FB5989AAE9881E0EDB3B42F01F7_908A13A6_8426D.jpeg?e=.jpeg

也就是说,只要对我提取出来的链接加一个这样的前缀就可以:
imgsrc='https://xcb.fzu.edu.cn/'+imgsrc

总结

通过这三次实验学习,我对bs、request、urllib、re都有了更深刻的理解。看到自己爬出来的东西很有成就感hh。以及对简单的爬虫框架有了更深入的理解:)

posted @ 2023-09-21 16:56  liyishui  阅读(135)  评论(1编辑  收藏  举报