返回顶部

数据采集——第一次作业

作业1:打印爬取的大学排名信息

1)代码&结果截图

import urllib.request
from bs4 import BeautifulSoup

def gethtmltext(url):
    try:
        html=urllib.request.urlopen(url)
        html=html.read()
        html=html.decode()
        return html
    except:
        return "error"

def data(html,num):
    # 标题在'theard'的子节点'tr'下,但是感觉直接打印更方便hhh
    print("排名","\t","学校名称","\t","省市","\t","学校类型","\t","总分")
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find('tbody').children:
        # 通过F12根据网页高亮提示,查找到有关大学排名相关信息的tag在'tbody'的子节点'td'下
        # 所以查找所有的td节点存到tds中
        tds = tr.find_all("td")
        # 直接将结果打印出来
        # 使用 strip() 移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
        # 注意:strip() 只能删除开头或是结尾的字符,不能删除中间部分的字符
        # 不使用strip()无法正确打印大学名称
        if num > 0:
            print(tds[0].text.strip()+"\t"+tds[1].text.strip()+"\t"+tds[2].text.strip()+"\t"+tds[3].text.strip()+"\t"+tds[4].text.strip())
            num = num-1
            
if __name__ == '__main__':
    url="http://www.shanghairanking.cn/rankings/bcur/2020"
    html=gethtmltext(url)
    data(html,30)   #取前三十的大学

2)心得体会

第一次写爬虫,虽然最后的代码很短也看起来比较简单,但是还是需要花不少时间百度,进行代码改错是一方面,知道思路但是具体实现又是一方面(道理我都懂,但是emmmm)
刚开始在URL上出问题,查了半天,才发现之前那个地址已经不存在了hhh
在开发人员工具里寻找tag还是蛮有意思的
使用了findall,感觉还是蛮神奇的,好用的呀
在前面都还好,参考了网上的一些代码照猫画虎,但是在最后的输出出了问题,大学名称出不来,而且format格式也不正确,最后查找+询问下才知道要strip去掉空格才行(emmmm还是不太懂)

作业2:爬取商城商品名称及价格

1)代码&结果截图

import requests
import re

def getHTMLText(url):

    try:
        # 淘宝网有反爬机制,要使用headers解决
        # headers理解:headers是解决requests请求反爬的方法之一,对反爬虫网页,设置一些headers信息,将自己模拟成浏览器取访问网站
        header = {'cookie':'miid=871473411901751759; tk_trace=oTRxOWSBNwn9dPyorMJE%2FoPdY8zfvmw%2Fq5v3gzlT6TfC88%2B8VsR2LZeh0x0uZ2lavUunwk7FaQvkKtSF8tQ1fLpJrqsz14B%2FyobMQW8Exzoggkl4YwBJKriMzZBFIh%2FIQKv1FPsNnhV6P2HnGBVjbylCyWiAFwW1fvt3aOBQ3uoAwtp6Of66wJHZ8YPC4wCiq2449kBKT6ufwkDkOEQ0bb3%2BTywKDqprZHDdiDO7zqxULUBvZcPasjtJ6gwye5pjKqluzqIlGZw5KubUzluZEGHyoRYm; lLtC1_=1; t=da76da827c8812bfc2ef4d091ab75358; v=0; _tb_token_=3f7e30eaede6e; _m_h5_tk=55efe72e4a7e4752c144c9d9a52250c0_1600601808838; _m_h5_tk_enc=480b7ec5d4482475e3f5f76e0f27d20f; cna=ZgXuFztWFlECAdpqkRhAo4LI; xlly_s=1; _samesite_flag_=true; cookie2=13aa06fa1e7317d5023153e70e45e95f; sgcookie=E100jT6nEM5pUv7ZaP1urbIUwS5ucPPcz2pG%2FHs9VDYB91E14tzvEV8mMtRfZtLe4dg8rBjdN9PEuYVfhzjqARIFKQ%3D%3D; unb=2341324810; uc3=id2=UUtP%2BSf9IoxzEQ%3D%3D&nk2=t2JNBkErCYOaTw%3D%3D&lg2=U%2BGCWk%2F75gdr5Q%3D%3D&vt3=F8dCufeJMlcWOvLCctE%3D; csg=6e737d42; lgc=%5Cu6E90%5Cu6E90%5Cu624B%5Cu62C9%5Cu624B; cookie17=UUtP%2BSf9IoxzEQ%3D%3D; dnk=%5Cu6E90%5Cu6E90%5Cu624B%5Cu62C9%5Cu624B; skt=d79995fc094af782; existShop=MTYwMDU5MTk1Ng%3D%3D; uc4=id4=0%40U2l1DTh9%2F%2BK9Ym%2BCcxbZCceodFVg&nk4=0%40tRGCEUSTUyhwCCuPpi69tV6rFUkp; tracknick=%5Cu6E90%5Cu6E90%5Cu624B%5Cu62C9%5Cu624B; _cc_=W5iHLLyFfA%3D%3D; _l_g_=Ug%3D%3D; sg=%E6%89%8B09; _nk_=%5Cu6E90%5Cu6E90%5Cu624B%5Cu62C9%5Cu624B; cookie1=AVdDOYh1aRzl%2BX23%2BL5DKrLq3hm6%2F%2BaYgNDVsRdW80M%3D; enc=Amz2MhdAq1awG9cmHzc5MLNi%2Bing6y4cR5EbHVPlJhWJxNKvr0B40mznTsnKW0JcubOujE6qhizMA84u7mBq2Q%3D%3D; hng=CN%7Czh-CN%7CCNY%7C156; mt=ci=85_1; uc1=existShop=false&cookie16=WqG3DMC9UpAPBHGz5QBErFxlCA%3D%3D&cookie14=Uoe0bU1NOIsDOA%3D%3D&cookie21=WqG3DMC9Fb5mPLIQo9kR&pas=0&cookie15=UIHiLt3xD8xYTw%3D%3D; thw=cn; JSESSIONID=6ECE41F4DC42E868790A52C0B362FD3C; isg=BNTUg0Kud-Dz7-OsCcrIFwHdpRJGLfgXLSfdwW61YN_iWXSjlj3Ip4rbWVFBujBv; l=eBgY5g8rOF5Pi0CSBOfanurza77OSIRYYuPzaNbMiOCP9b1B5N21WZru8mY6C3GVh60WR3rZpo7BBeYBqQAonxv92j-la_kmn; tfstk=cyJcBsT6YI5jdt1kOx6XAqHF5iMdwE3VudJvULmsgZ-4urfcF7PEePnlzEvT1',
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'}
        r = requests.get(url, headers=header, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "error"

def parsepageandprintresult(result, html):  # 查找结果并打印
    try:
        # 通过正则表达式获取html上所有的商品价格
        price = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html)
        # “view price\”来自于:点进任一商品页面,右键查看源代码,商品价格的html属性为view price,商品名称的属性为raw title
        # ‘\"’匹配双引号
        # ‘view_price’匹配view_price
        # ‘\:’匹配冒号
        # ‘\d\.’匹配一个整数加一个小数点
        # ‘[]*’ *号匹配中括号内的正则表达式,商品名称同理
        # (r'') r表示单引号内全为正则表达式符号
        # 获取商品名称
        title = re.findall(r'\"raw_title\"\:\".*?\"',html)
        print("序号", "价格", "商品名称")
        for i in range(len(title)):
            goodsprice = eval(price[i].split(':')[1])
            # eval()将字符串str当成有效的表达式来求值并返回计算结果
            # price[i].split(':')[1] 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型,用":"隔开,此式是将数组price的第i个字符串进行分割。
            goodstitle = eval(title[i].split(':')[1])
            print(i,goodsprice,goodstitle)      # 直接将结果进行打印
    except:
        print("error")

def main():
    # 只做到打印当前页的商品信息
    goods = '笔记本'
    url = 'https://s.taobao.com/search?q=' + goods
    result = []
    html = getHTMLText(url)
    parsepageandprintresult(result, html)
main()


2)心得体会

第二次写爬虫,emmm,用正则表达式好像跟第一次没啥关系了555
这次被headers跟正则表达式里的属性难住了
淘宝网的反爬机制解决要用headers也是百度了才知道,以及使用格式,我觉得getHTMLText()函数算是固定的叭,直接放上去就可了
正则表达式里的view_price和raw_title这两个HTML属性,始终没找到在哪里555,在网上有查,但是还是不懂怎么做,只能借鉴网上的了
总的来说,这次的作业还是收获满满的,在查阅的过程中也扩展一些知识,在最后代码运行结果出来以后,感觉真的很好的说
(幸亏在最后想起来修改博客,之前的view_price和raw_title属性已经成功找到啦,之前好像是浏览器搜索有点奇怪——9.30)

作业3:爬取网页的jpg图片

1)代码&结果截图

import urllib.request
import re

url = "http://xcb.fzu.edu.cn/"
webPage=urllib.request.urlopen(url)
data = webPage.read()
data = data.decode('UTF-8')

#处理网页提取图片链接
k = re.split(r'\s+',data)
s = []
sp = []
si = []

for i in k :
    # match()函数只检测RE是不是在string的开始位置匹bai配
    # search()会扫du描整zhi个string查找匹配,会扫描整个字符串并返回第一个成功的匹配  
    # 也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none
    if (re.match(r'src',i) or re.match(r'href',i)):
        # 使用正则表达式进行每步寻找图片信息
        # 将每步结果打印出来,可以更加显式的看出来是否提取正确
        # print(i)
        if (not re.match(r'href="#"',i)):
            # print(i)
            if (re.match(r'.*?jpg"',i)):
                # print(i)
                if (re.match(r'src',i)):
                    if("http" in i):
                        # 查询到该网站最下面一行是链接的图片不是,略过
                        continue
                    else:
                        s.append(i)

for it in s :
    if (re.match(r'.*?jpg"',it)):
        sp.append(it)

#获取图片链接并保存到本地
print("031804113")
for it in sp:
    m = re.search(r'src="(.*?)"',it)
    iturl = m.group(1)      # 列出第一个括号匹配部分
    print(iturl)
    tag1 = iturl.replace("/", " ")
    img = url + iturl
    urllib.request.urlretrieve(img, 'D:/2020test/爬虫/picture/' + tag1)


2)心得体会

这次爬取指定网页的所有jpg图片,有了前两次的收获,感觉会更加明朗
这次使用正则表达式一层一层进行筛选,最后获得图片的路径
在该网站的最后一行是其他网页的链接图片,没有进行爬取
这次没有使用函数,直接把代码写下来,看起来会散一些
这次任务最特殊的地方就是对图片地址的处理,以及将图片保存到本地
将图片保存到本地的代码感觉第一次接触知道了原理,还是是有意思的

。。。

posted @ 2020-09-26 18:12  DanspG  阅读(434)  评论(0编辑  收藏  举报