美文网首页计算机技术杂类一起玩python大数据 爬虫Python AI Sql
(30行代码)爬虫IP代理,re正则表达式等技术简单使用

(30行代码)爬虫IP代理,re正则表达式等技术简单使用

作者: 肥宅_Sean | 来源:发表于2018-02-03 20:22 被阅读59次

    在前段时间玩爬虫的时候,突然想到了一个好点子。用那个爬虫,先是爬取了整个网页的html,然后把这html先存起来。这样由于分析的时候需要不断尝试而对其他服务器要造成大量的负担的影响也就消除 。因为只需要分析这个html的文件即可。(别太粗鲁,对方维护服务器的也是同行,别对别人造成太大麻烦)

    爬取对象

    • 这里的url(网址)写的是百度的,原因很简单,百度每天能接受那么多次对它官网的访问,多那么几次的简单爬取,也不会造成太大负担。

    爬取结构

    1. 先得到百度的网页的html
    2. 将文件写入到对应的文档中

    爬取的技巧总结

    1. 用到了re这个库
    2. 爬取的时候使用了ip代理
    3. 爬取的时候,会根据url生成对应html储存文件,格式可以自己变

    爬取技巧详解

    1. re正则表达式的使用

    用在了筛选出特定名字来构建我想要的html文件名

    pattern='((?<=\.)|(?<=/))(\w+)(?=\.com)'这句话其实就是我设置的模式串
    意思很简单,就是,这个串前面是 . 或者是/,但后面一定是.com的中间那个部分。通过这个模式串,我们就可以将中间部分给筛选出来。
    比如:
    https://www.baidu.com的结果是 baidu
    https://abc.com的结果是abc
    这里用的是re中的search方法,re.search(pattern, string)
    【有人可能会问】为什么会有一个 re.purge()
    【答】: 这个是为了实现re的清除缓存的效果的,一般情况,不加也是对的。但清了会比较好,这样避免了多次使用正则表达式而导致速度降慢。

    2. IP代理的使用

    这个原来也很简单的,哈哈哈。以前一直以为需要很高技术才能实现呢。

    proxies 这个东西,就是我们用IP的参数了。
    具体传进去的时候,放的东西的话就是下面这个东西了

    proxies = {'HTTPS': 'https://218.27.166.198:80'}
    

    在requests发请求的时候,就用req = requests.get(url, headers=headers, proxies=proxies)这句话就好了。

    3. OS库的使用
    os.getcwd()还有 os.path.join()是我比较常用的函数。

    • 第一个是得到当前文件目录
    • 第二个是为了将两个文件目录给拼接起来,至于为什么不用自己加/的方式,主要还是为了避免由于不同的操作系统而导致的对这个地方的不断修改。用这样的一个函数就可以避免了。个人经验,不过觉得很有道理,哈哈哈(手动叉腰ing

    4. 文件流
    我这处理的时候,我用的都是wbrb说明我是将这数据都存储为二进制文件了。刚刚摸索出来的,这样就可以避免了以前做的很多很蠢的replace操作了hhhh

    源代码在此!

    import requests
    import os
    import re
    
    
    def getToThetxt(url, headers, proxies, pattern='((?<=\.)|(?<=/))(\w+)(?=\.com)', format='txt'):
        req = requests.get(url, headers=headers, proxies=proxies)
        req.encoding = req.apparent_encoding
        name = re.search(pattern, url)
        if name:
            name = name.group() + '.%s' % format
        else:
            raise Exception("Wrong url: %s" % url)
        re.purge()  # re的清除缓存
        path = os.getcwd()
        with open(os.path.join(path, name), 'wb') as f:
            f.write(req.text.encode())
        return name
    
    
    def gethtmlfromtxt(name, path=os.getcwd(), format='txt'):
        with open(os.path.join(path, name + '.%s' % format), 'rb') as f:
            return f.read()
    
    
    if __name__ == '__main__':
        url = 'https://www.baidu.com/'
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
        proxies = {'HTTPS': 'https://218.27.166.198:80'}  # ip代理
        # name = getToThetxt(url, headers, proxies)  # 爬取网页的时候记得把这个东西给取消注释(这样就可以了)
        print(gethtmlfromtxt('baidu'))  # print(gethtmlformtxt(name)) # 这里传的是文件名
    
    

    相关文章

      网友评论

        本文标题:(30行代码)爬虫IP代理,re正则表达式等技术简单使用

        本文链接:https://www.haomeiwen.com/subject/awouzxtx.html