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

第一次作业

作业①

(1)实验内容

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

①先观察每个大学的所在的标签元素

可以看到每个学校的信息都在一行中tr标签中,每个信息在td中

image

②观察需要的学校信息

需要的学校名称在第二个td单元格,学校所在省份在第三个tr单元格,学校类型在第四个tr单元格,学校评分在第五个单元格,学校办学层次在第6个单元格

image

③根据以上分析,编写代码的思路如下

  • 先获取单个页面的源码,

  • 获取学校信息表格

  • 逐步获取学校的每一项信息

代码如下

import urllib.request
import urllib.parse
from bs4 import BeautifulSoup

#发送url请求
url='http://www.shanghairanking.cn/rankings/bcur/2020 '
response = urllib.request.urlopen(url=url)
content   = response.read().decode('utf-8')

#创建BeautifulSoup对象
bs = BeautifulSoup(content,'lxml')

#爬取一页的数据
table = bs.find('table',attrs={'class':'rk-table'})
#每个学校的数据都在一个行tr中
tr_list = table.select('tr')
rank=0
uni_list=[]

for tr  in tr_list[1:]:  #舍弃掉第一列
    td_list = tr.select('td')
    name = td_list[1].select('div a')[0].text #学校名称
    province = td_list[2].text.strip()  	#学校所在省份
    unitype= td_list[3].text.strip()  	#办学类型
    score = td_list[4].text.strip()  #得分
    level_score = td_list[4].text.strip() #办学层次
    rank+=1
    uni_list.append([rank,name,province,unitype,score,level_score])

#在屏幕打印结果如下
for uni in uni_list :
    print(uni)

运行结果

image

(2)心得体会

本次实验使用了urllib和bs4库完成对2020年中国软科排名的信息的爬取,是一个比较基础的网页源码的解析的案例,总体难度不算大,但是如果想要实现多页数据的爬取就感觉是一个难点了,想实现多页爬取目前有两个思路,一是查找每一页的数据接口,找到规律,解析出不同数据页面所需要的请求格式,第二种就是使用selenium找到解析html源码,找到下一页的按钮标签,模拟点击

作业(2)

(1)实验内容

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

①心路历程:

本来想爬取淘宝网,但是遇到了一堆反爬,十分崩溃,退而求其次,爬取没有什么反爬的当当网

②在当当网中输入书包,按F12,查看单个商品的源码如下

image

②观察单个商品的源码

需要的数据为商品名称和商品价格,找到对应的标签位置

image

③单个页面的商品数为60

image

④根据上述的分析,爬取单页商品数据的算法设计思路如下

  • 发送请求,请求头携带一定信息

  • 获取页面源码(html)

  • 找到单个商品标签li

  • 遍历所有商品,得到商品li下的名称在标签和价格所在标签,将其中的文本提取出来

  • 保存在数据结构中

image

⑤多页爬取的设计

由于当当网的商品界面是由url 决定的,因此可以通过修改url实现翻页的功能,观察多个url后,发现翻页后只修改了一个参数page_index,于是要实现翻页只需要修改url中的page_index即可。

完整代码如下:

import requests
from bs4 import BeautifulSoup
from pprint import pprint

def get_items(page_nums):
    item_list=[]
    for page_num in range(1,page_nums+1):  # 每一页的url 只有 page_index的参数在变化
        url='http://search.dangdang.com/?key=%CA%E9%B0%FC&act=input'+'&page_index={}'.format(page_num)
        headers={
        "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
        }
        response = requests.get(url=url,headers=headers)
        response.encoding='gbk'
        content = response.text

        soup= BeautifulSoup(content,'lxml')
        li_list = soup.select("ul[class='bigimg cloth_shoplist'] li")

        for li in li_list:
            name = li.a.attrs['title']
            price = li.select('p[class="price"]')[0].text
            item_list.append((name,price))

    return item_list


if __name__ =="__main__":
    page_nums= 10
    itemlist=get_items(page_nums)
    print(len(itemlist))
    pprint(itemlist)

运行结果:

image

(2)心得体会

研究淘宝的反爬有点崩溃,刚进去就遇到一个非常规的滑动验证,还不是普通的滑块验证,进去之后,手动翻了几页,就会滑块验证,当然验证的问题可以使用打码平台解决,但是,又发现商品的数据是js动态加载的,崩溃,于是选择当当网进行爬取,当当网的爬取相对简单,使用urllib或者requests都可以进行爬取,然后使用Beautifulsoup进行解析即可,如果是使用re那么反而写的解析语法就更加复杂了

作业③

(1)实验内容

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

①只有一个页面,爬取单个页面的所有图片,那么问题就比较简单,只要找到页面中所有的img标签,然后获取img标签的src属性,通过src属性就可以访问到图片了

单个图片的标签如下

image

但是这里有一个坑点

src的链接并不是完整的图片链接,需要添加 "前缀" , https://xcb.fzu.edu.cn/ 才可以访问到图片

②获取每个图片的url后,使用urlretrieve保存图片即可,当然也可以直接获取图片的二进制内容后写入文件

代码如下:

import requests
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
url ='https://xcb.fzu.edu.cn/info/1071/4481.htm'
headers={
    "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}
response = requests.get(url=url,headers=headers)
response.encoding='utf-8'
content = response.text
soup  = BeautifulSoup(content,'lxml')

#获取所有的图片标签
imgs_list  =  soup.find_all('img') 
#遍历所有图片标签
for i,img in enumerate(imgs_list):
    url='https://xcb.fzu.edu.cn/'+img.attrs['src'] #获取图片的url
    urlretrieve(url,'./imgs/{}.jpg'.format(i)) #下载单张图片

运行得到的图片目录结构如下:

image

(2)心得体会

第三个实验相比前面的难度比较低,简单的地方在于只需要找出所有img标签即可,不需要太多的结构解析

posted @ 2023-09-21 17:24  crazypsz  阅读(76)  评论(0)    收藏  举报
//鼠标跟随动画