2024資料採集與融合實踐作業一

菜鸟bird發表於2024-10-16

碼雲連結gitee碼雲

作業①:

1)、爬取學校排名實驗:
o 要求:用requests和re庫方法設計某個商城(自已選擇)商品比價定向爬蟲,爬取該商城,以關鍵詞“書包”搜尋頁面的資料,爬取商品名稱和價格。
o 輸出資訊

排名 學校名稱 省市 學校型別 總分
1 清華大學 北京 綜合 852.5
2......
程式碼
#爬取學校排名資訊
import sqlite3
import requests
from bs4 import BeautifulSoup
url=r'http://www.shanghairanking.cn/rankings/bcur/2020'
req = None
try:
    req = requests.get(url)
    req.raise_for_status()
    req.encoding=req.apparent_encoding
except:
    print("error im request")

data=req.text

#解析資料
soup=BeautifulSoup(data,'lxml')
tbody_tag=soup.find('tbody')
school_tags=tbody_tag.find_all('tr')

#使用sqlite儲存資料
conn = sqlite3.connect('result1.db')
cursor = conn.cursor()
cursor.execute('''  
CREATE TABLE IF NOT EXISTS school (  
    rank INTEGER PRIMARY KEY,  
    name TEXT NOT NULL,
    city TEXT NOT NULL,
    type TEXT NOT NULL,  
    point DOUBLE NOT NULL  
)  
''')
for school_tag in school_tags:
    i=0
    for value_tag in school_tag.find_all('td'):
        if i==0:
            rank=value_tag.find('div').text
        if i==1:
            my_name=value_tag.find('span',attrs={'class':'name-cn'}).text
        if i==2:
            city=value_tag.text
        if i==3:
            type_school=value_tag.text
        if i==4:
            point=value_tag.text
        i+=1
    print(rank.strip(), my_name.strip(), city.strip(), type_school.strip(), point.strip(), sep='\t')
    cursor.execute("INSERT INTO school VALUES (?, ?, ?, ?, ?)", (rank.strip(), my_name.strip(), city.strip(), type_school.strip(), point.strip()))

# 提交事務
conn.commit()
# 關閉遊標和連線
cursor.close()
conn.close()

2)、心得體會

透過這個實驗我初步練習了beatifulsoup的find_all功能,學會了request請求頁面資訊和解析頁面資訊

作業②:

1)

o 要求:用requests和re庫方法設計某個商城(自已選擇)商品比價定向爬蟲,爬取該商城,以關鍵詞“書包”搜尋頁面的資料,爬取商品名稱和價格。
o 輸出資訊

序號 價格 商品名
1 65.00 xxx
2......
程式碼
#爬取商城價格資訊

import requests
import re
import sqlite3

#使用sqlite儲存資料
conn = sqlite3.connect('result1.db')
cursor = conn.cursor()
cursor.execute('''  
CREATE TABLE IF NOT EXISTS mail (  
    id INTEGER PRIMARY KEY, 
    price DOUBLE NOT NULL ,
    name TEXT NOT NULL    
)  
''')

#request獲取網頁資料
url=r'http://search.dangdang.com/?key=%CA%E9%B0%FC&act=input'
req = None
try:
    req = requests.get(url)
    req.raise_for_status()
    req.encoding=req.apparent_encoding
except:
    print("error im request")

data=req.text
#獲取商品資訊部分資料(在<ul></ul>)裡
match=re.search('''<ul class="bigimg cloth_shoplist" id="component_59">.*</ul''',data)
#start,end分別匹配每一件商品資訊的開頭和結尾(單件商品資訊在<li></li>裡)
data=data[match.start():match.end()]
start=re.search('<li',data)
end=re.search('</li',data)
i=0
while end!=None:
    #獲取單件商品的資訊my_data
    my_data=data[start.end():end.start()]
    #獲取商品的price
    price_sta_match=re.search('<span class="price_n">',my_data)
    price_end_match=re.search('</span>',my_data)
    price=my_data[price_sta_match.end()+5:price_end_match.start()]
    #獲取商品name
    title_match=re.search('title="',my_data)
    ddclick_match=re.search('ddclick',my_data)
    name=my_data[title_match.end():ddclick_match.start()].strip()
    name=name[:-1]
    #輸出編號,price,name並存進資料庫
    print(i,price,name,sep='\t')
    cursor.execute("INSERT INTO mail VALUES (?, ?, ?)",(i, price, name))
    # 更新遍歷的資料(data-my_data)
    data=data[end.end():]
    #找下一個商品資訊
    start = re.search('<li', data)
    end = re.search('</li', data)
    i+=1

# 提交事務
conn.commit()
# 關閉遊標和連線
cursor.close()
conn.close()

2)心得體會

這個實驗練習了re庫和request的使用,其中我想使用更為簡潔的表示式,但是總是不成功各種問題,只好使用比較笨的方法,分成兩部分查詢,正規表示式掌握的好感覺可以事半功倍,大大提高解析html文件的水平

作業③:

o 要求:爬取一個給定網頁( https://news.fzu.edu.cn/yxfd.htm)或者自選網頁的所有JPEG和JPG格式檔案
o 輸出資訊:將自選網頁內的所有JPEG和JPG檔案儲存在一個資料夾中
程式碼

#下載圖片

import requests
from bs4 import BeautifulSoup
import os.path as path
import re
import sqlite3

#使用sqlite儲存資料
conn = sqlite3.connect('result2.db')
cursor = conn.cursor()
cursor.execute('''  
DROP TABLE IF EXISTS pic
''')
cursor.execute('''  
CREATE TABLE IF NOT EXISTS pic (  
    id INTEGER PRIMARY KEY, 
    url TEXT NOT NULL ,
    suffix TEXT NOT NULL,
    picture BLOB     
)  
''')

#根據img_src把對應圖片下載到C:\Users\supermejane\Desktop\爬蟲實踐\實踐一\images資料夾
def downlord(url):
    global cnt
    img_path=path.join(my_path,str(cnt))
    index=re.search(r'\.(?=[^.]*$)',url).start()
    print(len(url),index)
    #ext為對應副檔名jpg,jpeg
    ext=url[index:]
    print(ext)
    req = requests.get(url)
    req.raise_for_status()
    data=req.content
    with open(img_path+ext,'wb') as file:
        file.write(data)
    print(str(cnt)+ext)
    cursor.execute("INSERT INTO pic VALUES (?, ?, ?, ?)",
                   (cnt, url, ext, sqlite3.Binary(data)))
    cnt+=1

if '__main__'==__name__:
    #獲取給定網站html資訊data
    url = r'https://news.fzu.edu.cn/yxfd.htm'
    req = None
    try:
        req = requests.get(url)
        req.raise_for_status()
        req.encoding = req.apparent_encoding
    except:
        print("error im request")
    data = req.text
    #儲存路徑my_path和圖片名cnt
    my_path = r'C:\Users\supermejane\Desktop\爬蟲實踐\實踐一\images'
    cnt=0
    #提取img標籤的src屬性,並且下載
    soup = BeautifulSoup(data, 'lxml')
    img_tags = soup.find_all('img')
    for img_tag in img_tags:
        src = img_tag['src']
        print(r'https://news.fzu.edu.cn/'+src)
        downlord(r'https://news.fzu.edu.cn/'+src)

    # 提交事務
    conn.commit()
    # 關閉遊標和連線
    cursor.close()
    conn.close()

2)心得體會

這個實驗主要是練習了下下載二進位制檔案,req.content獲得資料

相關文章