Python网络爬虫3(实例都不太适用了)

导学

在这里插入图片描述

1 Re(正则表达式)库入门

1.1 正则表达式的概念

在这里插入图片描述
全部列出来太繁琐,所以使用正则表达式
在这里插入图片描述
能将一组字符串表达出来
例1:
在这里插入图片描述
例2:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
编译后的特征与一组字符串是对应的
编译之前的正则表达式只是一个符合正大表达式语法的单一字符串

1.2 正则表达式语法

在这里插入图片描述
在这里插入图片描述
“.”: 字符表上出现的任一个字符
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第一个:不考虑每一段的取值范围和空间,只考虑它们之间的“.”来分割
第二个:出现的每一个字符串都是0个或1个或2个或3个
上面2个都不够精确
在这里插入图片描述

1.3 Re库的基本使用

在这里插入图片描述

1.3.1 正则表达式的表示类型——原生字符串类型

在这里插入图片描述
原生字符串中的’'不被表示为转义符
在这里插入图片描述
所以:
在这里插入图片描述

1.3.2 Re库主要功能函数

在这里插入图片描述
re.search():在字符串中搜索跟正则表达式一样的地方
re.match():只在给定的位置起匹配
re.findall():在字符串中发现所有与正则表达式相同的字符串的字串

re.search()

在这里插入图片描述
在这里插入图片描述
在正则表达式中’.‘匹配除’\n’外的任意字符
例:中国邮政编码,匹配“BIT 10081”
在这里插入图片描述
话说,写’BIT’有什么用,从re.match()穿越回来,这个’BIT’没有什么具体的含义,只是为了说明search不一定从头开始匹配
在这里插入图片描述

re.match()

在这里插入图片描述
在这里插入图片描述
发现没有匹配到任何结果
在这里插入图片描述
因为match从头开始匹配,所以不会匹配到’BIT 100081’
如果不判断是否匹配到,就会报错
在这里插入图片描述

re.findall()

在这里插入图片描述
在这里插入图片描述

re.split()

在这里插入图片描述
在这里插入图片描述
上面第2个加了maxsplit=1说明只匹配1次

re.finditer()

在这里插入图片描述
在这里插入图片描述
能够迭代返回每一次的结果,并对每次结果单独处理
在这里插入图片描述
在这里插入图片描述

re.compiler()

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.4 Re库的match对象

在这里插入图片描述

1.4.1 Match对象的属性

在这里插入图片描述

1.4.2 Match对象的方法

在这里插入图片描述
在这里插入图片描述
输出的是带有compile标识的,这说明,只有经过compile的才会是正则表达式
在这里插入图片描述
搜索的开始位置和结束位置

在这里插入图片描述
match返回的是第一次的匹配结果,如果要返回每一次的,就要用finditer()
在这里插入图片描述
匹配字符串的开始位置和终结位置
在这里插入图片描述
这2个位置的二元关系

1.5 Re库的贪婪匹配和最小匹配

在这里插入图片描述
PY.*N:以PY开头,以N结尾,中间是任意字符的字符串
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.6 总结

在这里插入图片描述

实例2 “淘宝商品比价定向爬虫”(requests+re)

1 “淘宝商品比价定向爬虫”实例介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本例并不对淘宝的服务器进行骚扰
在这里插入图片描述

2 “淘宝商品比价定向爬虫”实例编写

整体架构

在这里插入图片描述
在这里插入图片描述
depth=2:爬取2页
try:

except:
continue
爬取某页出错后继续爬取下一页

getHTMLText()

在这里插入图片描述

parsePage()

因为淘宝的价格等采用的是脚本语言的体现,只用搜索就可以办到,所以不必使用bs,这里只是用了正则
不过现在在淘宝搜东西会跳出来登陆界面,这个爬虫可能不太适用于现在了
视频里的淘宝源代码
它的价格在:

  • “view_price”:139.9
    它的名字在:
  • “raw_Title”:xxxxx

在这里插入图片描述
在这里插入图片描述
第一个斜杠是转义
表示的正则表达式:“view_price”:"[\d.]* "
在这里插入图片描述
eval():去掉双引号
取":"后面的

printGoodsList()

在这里插入图片描述
在这里插入图片描述
表示输出第一个元素长度为4,第二个元素长度为8,第三个元素长度为16
在这里插入图片描述

3 总结

在这里插入图片描述
源代码

import requests
import re
 
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 parsePage(ilt, html):
    try:
        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])
    except:
        print("")
 
def printGoodsList(ilt):
    tplt = "{:4}\t{:8}\t{:16}"
    print(tplt.format("序号", "价格", "商品名称"))
    count = 0
    for g in ilt:
        count = count + 1
        print(tplt.format(count, g[0], g[1]))
         
def main():
    goods = '书包'
    depth = 3
    start_url = 'https://s.taobao.com/search?q=' + goods
    infoList = []
    for i in range(depth):
        try:
            url = start_url + '&s=' + str(44*i)
            html = getHTMLText(url)
            parsePage(infoList, html)
        except:
            continue
    printGoodsList(infoList)
     
main()

好像不太行了,什么也没爬到
在这里插入图片描述

实例3 “股票数据定向爬虫”(requests+bs4+re)

1 “股票数据定向爬虫”实例介绍

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
查看源代码可知,百度股票更合适
但是百度股票不能在一页内找到好多个股票的信息
在这里插入图片描述
因此,打开东方财富网

在这里插入图片描述

在这里插入图片描述
参照页面的存储方式,对每一个信息源和信息值做相关的标定,可以利用键值对,字典类型是维护键值对的数据类型来保存各股的信息,然后再用字典把所有股的信息整合在一起

2 “股票数据定向爬虫”实例编写

为调试方便,使用traceback库

整体框架

在这里插入图片描述
getStockList():获得股票的列表
getStockInfo():获得单个股票的信息
在这里插入图片描述

getHTMLText()

在这里插入图片描述

getStockList()

东方财富网源代码:
在这里插入图片描述
都保存在中,只要解析出来,就会有股票的代码(是href的后几个数字)
使用正则表达式,但不是所有的里的href都会符合条件,所以可以使用try…except
在这里插入图片描述
正则表达式是深圳或上海的股票代码,以s开头,之后接h或z,然后是6个数字

getStockInfo()

百度股票那个网源代码

在这里插入图片描述

首先要先向各股发送请求
使用try…except来保证返回的页面是否正常
所有股票信息封装在

下,在class='stock-bets’下,
股票名称在class=‘bets-name’
在这里插入图片描述
使用split函数来获得股票对应名称的完整部分,因为某些名称的后面还关联了其他的标识符,使用空格将其分开后取分出来的第0部分
然后,所有的股票的信息在
key
value

在这里插入图片描述
在这里插入图片描述
完整代码

import requests
from bs4 import BeautifulSoup
import traceback
import re
 
def getHTMLText(url):
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""
 
def getStockList(lst, stockURL):
    html = getHTMLText(stockURL)
    soup = BeautifulSoup(html, 'html.parser') 
    a = soup.find_all('a')
    for i in a:
        try:
            href = i.attrs['href']
            lst.append(re.findall(r"[s][hz]\d{6}", href)[0])
        except:
            continue
 
def getStockInfo(lst, stockURL, fpath):
    for stock in lst:
        url = stockURL + stock + ".html"
        html = getHTMLText(url)
        try:
            if html=="":
                continue
            infoDict = {}
            soup = BeautifulSoup(html, 'html.parser')
            stockInfo = soup.find('div',attrs={'class':'stock-bets'})
 
            name = stockInfo.find_all(attrs={'class':'bets-name'})[0]
            infoDict.update({'股票名称': name.text.split()[0]})
             
            keyList = stockInfo.find_all('dt')
            valueList = stockInfo.find_all('dd')
            for i in range(len(keyList)):
                key = keyList[i].text
                val = valueList[i].text
                infoDict[key] = val
             
            with open(fpath, 'a', encoding='utf-8') as f:
                f.write( str(infoDict) + '\n' )
        except:
            traceback.print_exc()
            continue
 
def main():
    stock_list_url = 'https://quote.eastmoney.com/stocklist.html'
    stock_info_url = 'https://gupiao.baidu.com/stock/'
    output_file = 'D:/BaiduStockInfo.txt'
    slist=[]
    getStockList(slist, stock_list_url)
    getStockInfo(slist, stock_info_url, output_file)
 
main()

这个也不太行,网站改版了,爬不出来,与时俱进的重要性

3 “股票数据定向爬虫”实例优化

提高用户体验,但是只要是用requests和bs4就不会提高速度

3.1 速度提高:编码识别的优化

在这里插入图片描述
手工获得编码方式
修改为:
在这里插入图片描述
东方财富网的编码是’GB2312’
在这里插入图片描述
百度股票采用’utf-8’,不修改

3.2 体验提高:增加动态进度提示

在这里插入图片描述
爬取页面很多,动态显示进度,增加动态显示不换行的进度条

  • 增加1个count变量
    在这里插入图片描述
  • 不换行,使用转义符’\r’,能将我们打印的字符串的最后的光标提到当前行的头部,则下一次打印时会覆盖前一次的
    在这里插入图片描述
    '\r’在idle是被禁掉的,所以使用命令行
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值