我要一步一步网上爬

各种例题~

1.爬取‘最好大学网’大学排名:

#爬排名
import requests
from bs4 import BeautifulSoup
import bs4

#定义获取地址方法
def getHTMLText(url):
    try:
        r = requests.get(url,timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ''

def fillUnivList(ulist,html):
    soup = BeautifulSoup(html,'html.parser')
    for tr in soup.find('tbody').children:
        if isinstance(tr,bs4.element.Tag):
            tds = tr('td')
            ulist.append([tds[0].string,tds[1].string,tds[3].string])
   
def printUnivList(ulist,num):
    print('{:^6}\t{:^20}\t{:^6}'.format('排名','学校','总分'))
    for i in range(num):
        u = ulist[i]
        print('{:^6}\t{:^20}\t{:^6}'.format(u[0],u[1],u[2]))
        
    
def main():
    uinfo = []
    url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html'
    html = getHTMLText(url)
    fillUnivList(uinfo,html)
    printUnivList(uinfo,20)

main()

排名    	  学校  	    总分    
1     	 清华大学 		    94.6   
2     	 北京大学 	 	    76.5   
3     	 浙江大学 	 	    72.9   
4     	上海交通大学		    72.1   
5     	 复旦大学 	 	    65.6   
6     	中国科学技术大学	    60.9   
7     	华中科技大学	 	    58.9   
7     	 南京大学 	  	    58.9   
9     	 中山大学 	 	    58.2   
10    	哈尔滨工业大学	    56.7   
11    	北京航空航天大学	    56.3   
12    	 武汉大学 	 	    56.2   
13    	 同济大学 	  	    55.7   
14    	西安交通大学	   	    55.0   
15    	 四川大学 	 	    54.4   
16    	北京理工大学	  	    54.0   
17    	 东南大学 	        53.6   
18    	 南开大学 	        52.8   
19    	 天津大学 	        52.3   
20    	华南理工大学	        52.0   
铁血注释版

import requests
from bs4 import BeautifulSoup
import bs4

def getHTMLText(url):                       #方法:获取url内容并输出文本信息
    try:                                    #try except 结构
        r = requests.get(url,timeout = 30)  #访问的网页传给response
        r.raise_for_status()                #raise_for_status产生异常信息 如果返回不是200则except
        r.encoding = r.apparent_encoding    #r.apparent_encoding准确分析出编码方式给encoding
        return r.text                       #返回网页文本信息
    except:
        return ''

def fillUnivList(ulist,html):                   #将网页信息中的需求信息放入ulistl列表中
    soup = BeautifulSoup(html,'html.parser')    #煲汤,用html.parser解析
    for tr in soup.find('tbody').children:      #body标签下tr标签包含了所需大学信息,遍历每个body标签下的儿子(tr)的内容给tr
        if isinstance(tr,bs4.element.Tag):      #isinstance(obj,type)->Ture/False
            tds = tr('td')                      #tr标签下的td给列表tds
            ulist.append([tds[0].string,tds[1].string,tds[3].string])   #ulist增加字符串:排名、校名、分数
   
def printUnivList(ulist,num):                                     #打印ulist列表,num个数
    print('{:^6}\t{:^20}\t{:^6}'.format('排名','学校','总分'))    #format表达式{:^20}\t ‘:’引导符号 ^:居中 <:左对齐 格式化宽度20 \t:tab制表符
    for i in range(num):										 #0~num个ulist中依次赋值u[0],u[1],u[2]
        u = ulist[i]
        print('{:^6}\t{:^20}\t{:^6}'.format(u[0],u[1],u[2]))
        
    
def main():
    uinfo = []                      #uinfo列表放入各个大学的信息
    url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html'
    html = getHTMLText(url)         #调用getHTMLText方法    url转换成html
    fillUnivList(uinfo,html)        #调用fillUnivList方法   html放入uinfo列表
    printUnivList(uinfo,20)         #调用printUnivList方法  打印前20

main()

关于format函数的优化使中文对齐

chr(12288) 中文空格字符

'改版后'
def printUnivList(ulist,num):                                     #打印ulist列表,num个数

    tplt = '{0:^6}\t{1:{3}^20}\t{2:^6}'	######	注意变化						

    print(tplt.format('排名','学校','总分',chr(12288)))    #format表达式{:^20}\t  ^:居中 <:左对齐 格式化宽度20 \t:tab制表符
    for i in range(num):
        u = ulist[i]

        print(tplt.format(u[0],u[1],u[2],chr(12288))) ####注意变化

效果图~
在这里插入图片描述
over~

2.怀揣一颗赤诚学习之心,爬取一丢丢淘宝商品

https://www.taobao.com/robots.txt
淘宝爸爸禁止爬虫

User-Agent:  *
Disallow:  /

但是
我们是为了学习,为了国家,为了联盟,为了部落,为了LPL
就练习一下嘛
(其实我是为了618,1111比价)
话不多说,先撸为敬

def getHTML(url):
    try:
        r = requests.get(url,timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_enconding
        return r.text
    except:
        return ''
    

def paresHTML(ilt,html):
    try:
        plt = re.findall(r'"view_price":"[\d\.]*"',html)   #正则:搜索所有'view_price'字符串开头并包含字符串后面的数字信息(价格),返回列表
        tlt = re.findall(r'"raw_title":".*?"',html)
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])   #eval去掉引号,split以:分割之后取后半部分返回
            title = eval(tlt[i].spilt(':')[1])                     
            ilt.append([price,title])           #添加
    except:
        print('')
        
def printGoods(ilt):
    tplt = '{:^6}\t{:^10}\t{:^16}'
    print(tplt.format('序号','价格','名字'))
    count = 0
    for u in ilt:                                
        count += 1
        print(tplt.format(count,u[0],u[1]))
        
def main():
    goods = '神舟笔记本'
    start_url = 'https://s.taobao.com/search?q=' + goods
    depth = 2
    infoList = []
    for i in range(depth):
        try:
            url = start_url + '&s=' + str(44*i)
            html = getHTML(url)
            parseHTML(infoList,html)
        except:
            continue
    printGoods(infoList)

main()

但是没有爬出来结果
emmm不晓得为什么
原因是6.1号起需要先登录淘宝才可以搜索了 我滴个乖乖

我好了,你呢

over

================================================================

上面的办法是没办法撸出来的,但是代码和思路还是可以看一下的

是不是以为我用上面的办法爬不出来就完事了?
我又找到了一种更加暴力无脑、无比坚挺的法子
别说了,撸就完事了

硬核撸淘宝

淘宝爸爸已经屏蔽了搜索功能,只有你登录账号之后才可以进行搜索功能,但是我用的360极速浏览器竟然还可以继续搜索。
我用Chrome的时候他就会提示我需要登录,弹出页面说6月1号巴拉巴拉的,反正就是不允许你进行搜索。
首先用360极速浏览器进入淘宝搜索,本屌二话不说就搜索了一下‘神舟笔记本’,不要问我为什么搜神舟,问就是我乐意。
360极速浏览器给我们提供了两个重要元素,一个是url,一个是网页源代码,后面不用我多说了吧,嘿嘿嘿,有了这俩我们就可以进行半自动化硬核爬淘宝了,首先我们手动搜索商品,之后获取的url复制下来,直接贴在代码中,最后我们在网页源代码中找到商品信息的一系列代码直接原封不动的复制给另一个变量,到时候爬取的信息需要从这个变量中读取,我用的变量名字是’html’。
下面我们开始吧~

import re

def paresHTML(ilt,html):
        plt = re.findall(r'"view_price":"[\d\.]*"',html)  
        tlt = re.findall(r'"raw_title":".*?"',html)
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])  
            title = eval(tlt[i].split(':')[1])                     
            ilt.append([price,title])          

def printGoods(ilt):
    tplt = '{:^6}\t{:^10}\t{:^16}'
    print(tplt.format('序号','价格','名字'))
    count = 0
    for u in ilt:                                
        count += 1
        print(tplt.format(count,u[0],u[1]))
        
def main():
    html = ''  '文章字数限制所以源代码就不放了,自己右键复制一下就好啦'
    infoList = []
    paresHTML(infoList,html)
    printGoods(infoList)

main()

在这里插入图片描述
结果出来啦,现在没空优化,一会补~

猜你喜欢

转载自blog.csdn.net/dh0805dh/article/details/88717615