2023数据采集实践作业1

发布时间 2023-09-27 23:03:16作者: Scholaar

作业1

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

输出信息:

排名 学校名称 省市 学校类型 总分
1 清华大学 北京 综合 852.5
2 ... ... ... ...

运行截图和代码:

import urllib.request
from bs4 import BeautifulSoup

#尾号31,暂时不会翻页

def get_html(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    req = urllib.request.Request(url=url, headers=headers)
    html = urllib.request.urlopen(req).read().decode('utf-8')
    return html

def parse_html(html):
    print("排名     大学名称     省份     类型     总分")
    soup = BeautifulSoup(html, 'lxml')
    # 根据实际的HTML结构来找到大学排名的数据
    new = soup.select("table[class='rk-table'] tbody tr") #F12发现tbody下每个tr就是大学的信息
    for tr in new:
        try :
            td_list = tr.select("td")
            if len(td_list) >= 5:
                rank = td_list[0].text.strip()
                name = tr.select("td a")[0].text.strip()
                province = td_list[2].text.strip()
                type = td_list[3].text.strip()
                score = td_list[4].text.strip()
                print(rank, name, province, type, score, sep="\t")
        except Exception as err:
            print("error")

def main():
    url = "https://www.shanghairanking.cn/rankings/bcur/2020"
    html = get_html(url)
    parse_html(html)

if __name__ == "__main__":
    main()

心得体会:

最开心的地方就是这个网站没有反爬技术了,只要正确找到元素就行了

作业2

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

输出信息:

序号 价格 商品名
1 65.00 xxx
2 ... ...

运行截图和代码:

#爬取当当网“书包”搜索页的商品名称和价格
from bs4 import BeautifulSoup 
from fake_useragent import UserAgent
import requests

# 创建一个随机User-Agent生成器
user_agent = UserAgent()
# 设置请求头
headers = {
    'User-Agent': user_agent.random,
}

def gethtml(url):
    
    session = requests.Session()
    html = session.get(url)
    return html

def crawl(html):
    
    soup = BeautifulSoup(html, 'lxml')
    names = soup.select("li[class^= 'line'] a img")
    prices = soup.select("li[class^= 'line'] p[class = 'price'] span")
    
    i = 0
    
    for name,price in zip(names,prices):
        
        i +=1
        print("第{}个商品:".format(i))
        print("商品名称:",name["alt"],"商品价格:",price.text)
        
if __name__ == "__main__":
    url = "http://search.dangdang.com/?key=%CA%E9%B0%FC&act=input&page_index=1"
    html = gethtml(url).text
    crawl(html)

心得体会:

没有反爬!!一开始写的淘宝,但是反爬机制有点难对付,就转向当当了,注意到商品的名称其实就是a的title和img的alt,就直接用了

作业3

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

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

运行截图和代码:

from bs4 import BeautifulSoup 
from fake_useragent import UserAgent
import os
import requests

# 创建一个随机User-Agent生成器
user_agent = UserAgent()
# 设置请求头
headers = {
    'User-Agent': user_agent.random,
}

url = "https://xcb.fzu.edu.cn/info/1071/4481.htm"

def gethtml(url):
    
    session = requests.Session()
    html = session.get(url)
    return html
    
def crawl(html):
    
    if not os.path.exists("picture"):
        os.makedirs("picture")
        
    soup = BeautifulSoup(html, 'lxml')
    pictures = soup.select("p[class = 'vsbcontent_img'] img")
    
    i = 0
    
    for picture in pictures:
        
        i +=1
        picture_url = "https://xcb.fzu.edu.cn/"
        img_url = picture_url + picture["src"]
        image_name = "Picture{}.jpeg".format(i)
        img = gethtml(img_url).content
        with open("picture/" + image_name ,"wb" ) as f:
            f.write(img)
            
if __name__ == "__main__":
    
    html = gethtml(url).text
    crawl(html)
        

心得体会:

图片所在的地址的前缀跟网址是不一样的,要重新设置一个url才能正确找到图片并爬取,地址直接获取的是img里的src,前面再加上url