安静地做只小爬虫~

作者: idealclover | 来源:发表于2017-05-30 22:12 被阅读0次

    起因

    自己的电商课要做关于名医主刀的pre
    说到pre就难免要各种搜索,然而自己实在太懒
    正巧最近学了点爬虫的东西但是不会用,也算实战一下
    而且是假期还没什么事情做,那就开动咯

    免责声明

    自己做爬虫也只是想简单地试试,不仅设置了时间上的暂停(一页三秒),而且在实际使用时也只是爬了三四页。

    在百度等部分搜索引擎的robots.txt文件中禁止或了爬虫行为,代码中不透露相关信息(当然如果想找怎么也能找到)

    如出现任何侵权行为与本文作者无关,特此声明

    拟定需求

    • 手动输入所想要寻找的关键字和所要寻找的页数
    • 获取搜索引擎对关键词的搜索页面
    • 通过页面抓取链接文字,链接和详细信息
    • 到处到data目录下的关键字同名文本文件中

    1.0版本

    最开始爬虫没想包括封装啊函数啊那么多,就是想单纯地实现它
    网上介绍爬虫的blog太多了,重点介绍下愚蠢的某翠踩过的坑

    import requests
    from bs4 import BeautifulSoup
    import os
    
    • 所使用的库

    创建输出文件

    if not os.path.exists('data'):
            os.mkdir('data')
    filename='data\\data.txt'
    fp = open(filename, 'wb')
    if not fp:
        print('文件打开失败')
    
    • 相对路径和绝对路径
      • 最开始为了简单使用了绝对路径,后发现不具有可移植性
      • 相对路径:以.py文件所在目录为根目录
    • if not: 最开始pycharm一直提醒我可以改进,最后才发现
    • 'wb'模式:二进制写模式,导致了之后的很多byte-str转换
      • 用二进制写可以避免很多转码问题闹心
      • 但是同时要注意把相应str用合适转码方式转成byte

    实现寻找和输出

    n = 0    #总获取条数
    while(n < 80):
        r = requests.get('//某地址//')
        soup = BeautifulSoup(r.text, 'lxml')
        n += 20    #20条一页
        
        #以下内容因网站不同而不同
        for item in soup.findAll("div", {"class": "result"}):
            a_click = item.find('a')
            #标题
            if a_click:
                fp.write(a_click.get_text().encode('utf-8'))
            fp.write(b'#')
            #链接
            if a_click:
                fp.write(a_click.get("href").encode('utf-8'))
            fp.write(b'#')
            #摘要
            c_abstract=item.find("div", {"class": "c-summary c-row "})
            if c_abstract:
                strtmp=c_abstract.get_text()
                fp.write(strtmp.encode('utf-8'))
            #带图片的摘要
            else:
                c_abstract=item.find("div", {"c-span18 c-span-last"})
                strtmp=c_abstract.get_text()
                fp.write(strtmp.encode('utf-8'))
            fp.write(b'#')
            fp.write('\r\n'.encode('utf-8'))
    fp.close()
    
    • 通过requests.get拿到搜索引擎对地址的回复
    • 通过BeautifulSoup库解析
    • 在Chrome上用F12拿到标题,链接,摘要的特征
    • 通过encode将str转换成二进制编码写入文件
    • 很神奇的是只有加'\r\n'时才能成功换行,单独不可

    2.0版本

    原版本缺点

    • 不能自定义搜索词和页数
    • 封装不明显,可重复利用性不高
    • 没有时间停顿,不厚道
    • 一点提示都没有
    import requests
    from bs4 import BeautifulSoup
    import time
    import os
    
    • 所使用的库

    get_result(key_words, pagenum)函数

    def get_result(key_words, pagenum):
        headers = {'User-Agent' : //某 user agent//}
        url = (//某//+ key_words +//链//+ str(pagenum * 20) + //接//)
        r = requests.get(url, headers=headers)
        soup = BeautifulSoup(r.text, 'lxml')
        return soup
    
    • headers:如果想伪装成自己现在用的浏览器可以google:what is my user agent
    • 大部分还是原来的配方和熟悉的味道

    deal_data(key_words, pagenum)函数

    def deal_news(key_words, pagenum):
    
        if not os.path.exists('data'):
            os.mkdir('data')
        filename = 'data\\' + key_words + '.txt'
        fp = open(filename, 'wb')
        if not fp:
            print('文件打开失败')
    
        n = 0
        while(n < pagenum):
            print("working...(page " + str(n+1) + "/" + str(pagenum) + ")")
            soup = get_result(key_words, n)
            n += 1
            #获取部分同上
            time.sleep(3)
        fp.close()
        print("success!")
    
    • 可以看到其实也没啥改进
    • 可是就是看着顺眼了很多

    测试函数

    if __name__ == "__main__":
        keywords = input("You keywords?")
        while True:
            try:
                num = input("How many pages do you want? ")
                num = int(num)
                break
            except ValueError:
                print('Please input an *integer*')
        deal_data(keywords, num)
    

    后记

    原理掌握了之后又兴致勃勃地换了几个网站
    不过这还只是很初级的爬虫了~
    等待以后能变得更厉害~

    相关文章

      网友评论

        本文标题:安静地做只小爬虫~

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