爬虫学习

作业①:

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

输出信息:

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

代码:

from bs4 import BeautifulSoup
import urllib.request

req = urllib.request.Request("http://www.shanghairanking.cn/rankings/bcur/2020")
html = urllib.request.urlopen(req).read()
soup = BeautifulSoup(html, "html.parser")
list = soup.select("tbody tr") #找到每一行
print("排名\t学校\t省市\t类型\t总分")
for item in list[0:10]:
    ls = item.select("td") #排行榜本质是表格,找到每一个单元格
    inf = []
    for i in ls[0:5]:
        if i == ls[1]: #当读取大学名称的时候,只读出xx大学
            text = i.find("a").text.replace(" ", "").replace("\n", "")
        else:
            text = i.text.replace(" ", "").replace("\n", "")
        inf.append(text)
    print(inf[0],inf[1],inf[2],inf[3],inf[4])

输出结果

心得体会
本质上还是要回归页面源代码,通过F12查看每个元素之间的关系,再通过bs库逐层遍历找到需要的数据。
一开始输出每个单元格数据时没有进行特殊处理,直接用以下代码
text = i.text.replace(" ", "").replace("\n", "")
在输出大学名称的时候会连带着输出英文名+双一流/985/211等一长串丑丑的东西,查看对应元素代码时才发现在该单元格内,大学名称又被藏在了a标签下,于是使用了一个特殊判别~
本来想控制一下输出对齐的,format后发现连输出都没了!!!于是作罢。

作业②:

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

输出信息:

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

代码:

import requests
import re

def getText(url): #获取资源
    kv = {'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 Edg/117.0.2045.31',
          'cookie': 'fp=0a102b62cbce8a03aa26712c0b4ed804; Hm_lvt_7705e8554135f4d7b42e62562322b3ad=1695402122; __utmc=188916852; __utmz=188916852.1695402122.1.1.utmcsr=cn.bing.com|utmccn=(referral)|utmcmd=referral|utmcct=/; Hm_lpvt_7705e8554135f4d7b42e62562322b3ad=1695405842; __utma=188916852.52193247.1695402122.1695402122.1695405842.2; __utmt=1; __utmb=188916852.1.10.1695405842; dfp=0H88kUZe0CPN6z826UZ2kU0V0N88kUZM6W82EVKM0CPM0W82EVZM0H820UZM0UM=EUZ86Ut80c55'
          }
    data = requests.get(url, headers=kv, timeout=30)
    data.encoding = data.apparent_encoding
    return data.text

def parsePage(data): #取出需要的数据
    plt = re.findall(r'data-price="\d+', data) #找到每一个商品的价格
    tlt = re.findall(r'class="item-title".+"', data) #找到每一个商品名称
    #print(plt)
    #print(tlt)
    for item in tlt:
        item1 = item.split('"')[5] #除去名称前用于定位的表达式
        titlelist.append(item1)
    for item in plt:
        item2 = item.split('"')[1]
        pricelist.append(item2)

url = "https://gwdang.com/search?crc64=1&s_product=%CA%E9%B0%FC"
titlelist=[] #用于存最终的商品名称列表
pricelist=[] ##用于存最终的商品价格列表
html = getText(url)
parsePage(html)
count = 1
print("序号 价格 商品名")
for i in range(0,30):
    print(count,pricelist[i],titlelist[i])
    count+=1

输出结果

心得体会
先要哀嚎一声正则表达式真的难上手啊(发出尖锐的爆鸣),但是上手之后就会很快速地找到自己想要的东西。
一开始准备爬当当、京东等叫得上名的网站的,结果发现这些网站的商品名称都被拆成了一段一段的,尝试了一番没有输出后转投小网站——(比如淘宝比价网什么的~)
然后又陷入误区,因为商品名称基本是放在a标签里的,就会有一些奇奇怪怪的东西belike:

所以一开始以为要从标签的最开始进行匹配,结果找到了一堆网页最开始的小标题==,然后才意识到可以从唯一标识商品名称的地方开始匹配!在这里就是item-title啦。
代码里用了split来去掉标签里的描述,其实最开始想用replace但是没成功不知道为什么捏,最后就是以为小网站比较没有关系于是肆无忌惮的print结果ip被禁了一会会……(罪过罪过)
555这道题改了好几个小时但是最后输出的时候真的非常有成就感T T
小tips:写正则表达式的时候可以用一些在线检测的网站来查看自己写得对不对!

作业③:

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

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

代码:

import requests
from bs4 import BeautifulSoup
import urllib.request

kv = {'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 Edg/117.0.2045.31',
      'Cookie':'_gscu_1331749010=78179956ew604e60; JSESSIONID=3BC06456BAC55B92E30EC9CAD673192F'}
url = requests.get('https://xcb.fzu.edu.cn/info/1071/4481.htm', headers=kv)
url.encoding = 'utf-8'
html = url.text
soup = BeautifulSoup(html,'html.parser')
x = 1 
pic = soup.find_all('img')
for i in pic:
    imgsrc=i.get('src')
    #print(imgsrc)
    filename = 'D:/DATASET/img/%s.jpg' %x #保存路径
    x+=1
    urllib.request.urlretrieve('http://xcb.fzu.edu.cn'+imgsrc, filename)

输出结果

心得体会
爬取图片的时候,路径如果只写到文件夹会报错没有访问权限,必须要具体到每个的文件名。代码里简单粗暴地把所有图片保存为jpg格式对本题适用,但是如果原图是png格式可能会出错,暂时没想到好的解决办法。

posted @ 2023-09-24 14:24  永不秃  阅读(3)  评论(0编辑  收藏  举报