IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> Pycharm学习记录(二)——正则表达式的应用 -> 正文阅读

[开发工具]Pycharm学习记录(二)——正则表达式的应用

上一篇文章大致讲了爬虫的五个基本步骤,还遗留了一个问题(目前都已解决)。在这里简单记录一下。

正则表达式,网上有很多对它知识的介绍,各种视频教学、各种文字说明、各种表格,作为一个新手(编程小小白),我坦白,确实没看懂。没办法,只有去请教下高手们了。后面也零零碎碎学到了一点,能够自己写出规则,匹配出想要的信息了。真不容易。

保姆式教学,步骤如下:

①先输出网页信息,并复制、粘贴到这个网址:regex101: build, test, and debug regex? 的2里面。

?②在1里面,开始编辑正则表达式规则,编辑的信息会在2里面标蓝,需要匹配的信息会在2里面标绿。比如匹配标题。(.*?)? ?这个就代表要匹配的信息所在的位子。

?③熟练掌握了上面的技巧之后,就可以写进代码里。首先,建立规则;其次,作匹配。

#设置正则表达式抓取规则
findTitle = re.compile(r'    ')#标题,将1里面的内容复制粘贴到''里面


#匹配
data = []
item = str(item) #新建一个列表,方便存储所需要的信息

title = re.findall(findTitle,item)[0]
data.append(title)  

datalist.append(data)

④写在最后。爬虫爬取信息固然很方便,但是要注意做好延时,用网文明。因为要写论文,所以这段时间零零散散学了些关于爬虫的知识,学得很浅,而且目前的代码还有很多可以优化的空间。希望大家可以一起学习,一起进步。下面附上这段时间来,爬取爱彼迎网站房源信息页的数据代码。

#coding=utf-8

from bs4 import BeautifulSoup #解析
import re  #正则表达式,进行文字匹配
import urllib.request,urllib.error
import xlwt  #进行excel操作
import random
import time


def main():
    baseurl = "https://www.airbnb.cn/s/%E5%8C%97%E4%BA%AC/homes?&items_offset="  #目标网址
    datalist = getData(baseurl)
    savepath = 'Airbnb.xls'
    saveData(datalist,savepath)

#设置正则表达式抓取规则
findTitle = re.compile(r'<div class="_qrfr9x5".*?>(.*?)<')#民宿标题
findImgSrc = re.compile(r'<img alt.*?uri="(.*?)aki_policy=large"')#图片链接
findType = re.compile(r'<span style="color:#767676">(.*?)<')#民宿类型
findJudge = re.compile(r'<span class="_1clmxfj">(.*?)<')#评分与评论数
# findJudge1 = re.compile(r'<span class="_1clmxfj">(.*?)分')#评分
# findJudge2 = re.compile(r'<span class="_1clmxfj".*? · (.*?)条评论')#评论数
findSup1 = re.compile(r'<span class="_1pdh8u0">(.*?)<')#补充1  (超赞房东、低价优势、可开发票)最多3个
findSup2 = re.compile(r'<span class="_faldii7" style="color:#484848"><span>(.*?)<')#补充2  (其他)最多6个
findPrice = re.compile(r'<span>¥(.*?)<')#民宿价格
# findOther = re.compile(r'')#其他

def getData(baseurl):
    datalist = []
    for i in range(0,10000,1):
        url = 'https://www.airbnb.cn/s/%E5%8C%97%E4%BA%AC/homes?&items_offset={}'.format(i)  #??翻页
        time.sleep(10)
    # for i in range(10):
    #     url = requests.get(baseurl.replace('-pn_',str((i-1)*20)))

        html = askURL(url)
        time.sleep(7)

        #2.主逐一解析网页
        soup = BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div', class_="_fhph4u"):

            data = []
            item = str(item)

            title = re.findall(findTitle,item)[0]
            data.append(title)

            imgsrc = re.findall(findImgSrc, item)[0]
            data.append(imgsrc)

            type = re.findall(findType, item)[0]
            data.append(type)

            judge = re.findall(findJudge, item)[0]
            data.append(judge)

            # judge1 = re.findall(findJudge1, item)[0]
            # data.append(judge1)
            #
            # judge2 = re.findall(findJudge2, item)[0]
            # data.append(judge2)

            sup1 = re.findall(findSup1, item)[0]#最多输出三个[],但是如果只有两个就自动填充第一个,可不可以填充空格?
            data.append(sup1)

            sup2 = re.findall(findSup2, item)[0]#输出六个[],同上问
            data.append(sup2)

            price = re.findall(findPrice, item)[0]
            data.append(price)

            datalist.append(data)
        # print(datalist)
        time.sleep(5)
    return datalist


def askURL(url):
    proxy_list = [
IP池就先不共享了,建议大家自己找资源。
    ]

    #绑定某个IP
    proxy = random.choice(proxy_list)
    urlhandle = urllib.request.ProxyHandler({'http': proxy})
    opener = urllib.request.build_opener(urlhandle)
    urllib.request.install_opener(opener)

    headers = {
headers信息也不共享了,每个人的都不一样,具体怎么获取,前面有一篇文章有详细讲过。
    }

    #用户代理,模拟头部信息
    req = urllib.request.Request(url,headers = headers)
    html = ""
    try:
        response = urllib.request.urlopen(req)
        html = response.read().decode("utf-8")
        # print(html)
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    time.sleep(random.randint(2,5))
    return html

# 3.保存数据
def saveData(datalist, savepath):
    book = xlwt.Workbook()  # 创建
    sheet = book.add_sheet('sheet1')
    col = ["标题", "图片链接", "类型", "评分与评论数", "补充1", "补充2", "价格"]

    for i in range(0, 7):
        sheet.write(0, i, col[i])
    for m in range(0, len(datalist)):
        print("第%d条" % (m + 1))
        data = datalist[m]
        for j in range(0, 7):
            print(data[j])
            sheet.write(m + 1, j, data[j])
    book.save(savepath)

if __name__ == '__main__':  #当程序执行时调用函数
    main()
    print("爬取完毕!")

⑤如果不是想要爬取爱彼迎的信息的话,建议更改代码中这些部分:

?

爬虫目前就先学到这里了。后面会继续学习批量图片的HSV值采集与分析,以及内容文本的机器学习算法。欢迎大家一起交流与学习,为毕业而奋斗。

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-11-15 16:04:47  更:2021-11-15 16:05:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:52:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码