栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Pycharm学习记录(二)——正则表达式的应用

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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'(.*?)<')#民宿标题
findImgSrc = re.compile(r'(.*?)<')#民宿类型
findJudge = re.compile(r'(.*?)<')#评分与评论数
# findJudge1 = re.compile(r'(.*?)分')#评分
# findJudge2 = re.compile(r'(.*?)<')#补充2  (其他)最多6个
findPrice = re.compile(r'¥(.*?)<')#民宿价格
# 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值采集与分析,以及内容文本的机器学习算法。欢迎大家一起交流与学习,为毕业而奋斗。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/499365.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号