第一次作业——结合三次小作业

1.作业一

要求:用requests和BeautifulSoup库方法定向爬取给定网址的数据,屏幕打印爬取的大学排名信息。

代码实现和结果:

from bs4 import BeautifulSoup
from bs4 import UnicodeDammit
import urllib.request
import sqlite3

def daxue():
    # 要爬取的网站
    url="http://www.shanghairanking.cn/rankings/bcur/2020"
    req=urllib.request.Request(url)
    data=urllib.request.urlopen(req)
    # 读取网站信息
    data=data.read()
    dammit=UnicodeDammit(data,["utf-8","gbk"])
    data=dammit.unicode_markup
    # beautifulsoup解析网页内容
    soup=BeautifulSoup(data,"html.parser")
    # 使用css语法查找元素,查找<tbody>下的<tr>标签,返回一个列表,列表中存储每个大学的信息
    list=soup.select("tbody tr")
    # tplt = "{0:{3}^10}\t{1:{3}^10}\t{2:^10}\t{3:^10}\t{4:^10}"
    # 规定每列所占的长度,使列表输出整齐
    tplt = "{0:^13}\t{1:^13}\t{2:^13}\t{3:^10}\t{4:^10}"
    # 输出列表的表头  chr(12288)中文
    print(tplt.format("排名","学校","省市","类型","总分",chr(12288)))
    for item in list[0:10]:
        ls=item.select("td")
        length=len(ls)
        count=0
        inf=[]
        for i in ls[0:5]:
            count+=1
            text = i.text.replace(" ", "").replace("\n", "")
            inf.append(text)
        #    依次输出大学信息
        print(tplt.format(inf[0],inf[1],inf[2],inf[3],inf[4],chr(12288)))

daxue()

代码结果

心得体会:第一次打印的时候输出的不齐,在网上找了一些方法,使用tplt = "{0:13}\t{1:13}\t{2:13}\t{3:10}\t{4:^10}"规定每列所占的长度

结果有所改善,但仍有瑕疵,下次试试dataframe

2.作业二

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

代码实现和结果:

from bs4 import BeautifulSoup
from bs4 import UnicodeDammit
import urllib.request
import pandas as pd
import re


goods="铅笔"
keyword=urllib.parse.urlencode({"keyword":goods})

url="https://search.jd.com/Search?keyword="+keyword
#模拟浏览器头部信息,伪装成浏览器,而不是会报错的网络爬虫
head={
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36 Edg/85.0.564.44"
    }
# 获取网页内容
def getSoup(url):
    req = urllib.request.Request(url,headers=head)
    data = urllib.request.urlopen(req)
    data = data.read()
    dammit = UnicodeDammit(data, ["utf-8", "gbk"])
    data = dammit.unicode_markup
    # 调用BeautifulSoup解析网页内容
    soup = BeautifulSoup(data, "html.parser")
    return soup

def Spider(soup):
    price_li=[]
    goods_li=[]
    # 选取网页中的价格等信息
    # price = soup.select("div[class='p-price'] strong i")
#**价格的正则表达式**
    reg = r'<em>¥</em><i>..*</i>'
    price=re.findall(reg,str(soup))

    goods = soup.select("div[class='p-name p-name-type-2'] a em")

    for i in range(0,10):
        if(i>len(price)):
            break
        # 获取价格的字符串并去掉空格换行
        # price_li.append(price[i].text.replace("\n","").replace(" ","").replace("\t",""))
        price_li.append((price[0][13:]).replace("</i>",""))
        goods_li.append(goods[i].text.replace("\n","").replace(" ","").replace("\t",""))
    dict={"商品":goods_li,"价格":price_li}
    return dict

# 打印出商品
def printGoods(dict):
    data=pd.DataFrame(dict)
    # 设置列表的属性
    pd.set_option('display.max_columns', 1000)
    pd.set_option('display.width', 200)
    pd.set_option("expand_frame_repr",False)
    pd.set_option('display.max_colwidth', 50)
    pd.set_option('display.colheader_justify','center')
    # 列表显示中文
    pd.set_option('display.unicode.ambiguous_as_wide', True)
    pd.set_option('display.unicode.east_asian_width', True)
    print(data)

soup=getSoup(url)
dict=Spider(soup)
printGoods(dict)


结果:

###心得体会: 我特别超级无敌想用正则表达式,但是京东网页商品描述太乱了,没有统一的表达式,我被迫选择了css选择器 但价格可以用正则表达式 这次用dataframe打印表格,只是没想到它似乎没有设置单元格内容居左的函数,为了整齐我只能限制列宽让他不完全显示了 写代码之前就知道了淘宝反爬虫的厉害,没想到唯品会也这么强(还是我技艺不精),于是选了比较友好的京东

3.作业三

要求:爬取一个给定网页或者自选网页的所有JPG格式文件

代码实现和结果:

from bs4 import BeautifulSoup
from bs4 import UnicodeDammit
import urllib.request
import re

Wurl="http://xcb.fzu.edu.cn/"
head={      #模拟浏览器头部信息,伪装成浏览器,而不是会报错的网络爬虫
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36 Edg/85.0.564.44"
    }
# 获取网页内容
def getSoup(url):
    req = urllib.request.Request(url,headers=head)
    data = urllib.request.urlopen(req)
    data = data.read()
    dammit = UnicodeDammit(data, ["utf-8", "gbk"])
    data = dammit.unicode_markup
    soup = BeautifulSoup(data, "html.parser")
    print(str(soup))
    return str(soup)


def Spider(soup):
    reg=r'img.*src="(.+?\.jpg)"'
    # listurl=re.findall(r'http:.[^"]+\.jpg',soup)
    listurl=re.findall(reg,soup)
    # print(listurl)
    x=1
   #直接爬取的图片链接不是标准的url,要加http:
    for xurl in listurl:
        if(xurl.startswith("http:")):
            url=xurl
        else:
            url=Wurl+xurl

        # print(url)
        pathName = "D://images//" + str(x) + ".jpg"  # 设置保存路径和文件
        urllib.request.urlretrieve(url,pathName)
        x+=1

Spider(getSoup(Wurl))

结果:

心得体会

直接爬取的图片链接不是标准的url,要加http:,转化为标准url

posted @ 2020-09-28 22:06  花与爱因斯坦  阅读(299)  评论(0编辑  收藏  举报