zoukankan      html  css  js  c++  java
  • 百度搜索引擎关键字URL采集爬虫优化行业定投方案高效获得行业流量-代码篇

    需要结合:《百度搜索引擎关键字URL采集爬虫优化行业定投方案高效获得行业流量--笔记篇》 一起看。

      1 #!/user/bin/env python
      2 # -*- coding:utf-8 -*-
      3 # author:隔壁老王
      4 
      5 import requests
      6 import re
      7 
      8 def baidu_spider(key,pn):
      9     #第一步:确认目标URL: 百度搜索“程序设计”的url
     10     #key = '正则表达式'
     11     #url = 'https://www.baidu.com/s?wd=%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1&rsv_spt=1&rsv_iqid=0x967855b80019cdd1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_sug3=3&rsv_sug1=2&rsv_sug7=100&inputT=643536&rsv_sug4=644636'
     12     url = 'https://www.baidu.com/s?&rsv_spt=1&rsv_iqid=0x967855b80019cdd1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_sug3=3&rsv_sug1=2&rsv_sug7=100&inputT=643536&rsv_sug4=644636'
     13     #优化点 1 这个url被写死了,如果想爬取其他东西该怎么办呢
     14     fb = open('res\{}.txt'.format(key), 'w', encoding='utf-8')  # 优化点3
     15     #优化点 4  实现翻页
     16     for i in range(pn):
     17 
     18         #还有一个请求参数
     19         data = {'wd':key,'pn': i * 10}
     20 
     21         #wd=%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1  这个其实就是“程序设计”,是被编码成这样子的,搜索的关键字
     22 
     23         #第三步:伪装请求头,
     24         headers = {
     25             'User-Agent':r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
     26         }
     27         #字典中的信息在Headers栏的Request Headers下的User-Agent :用来标识用户类型,是谷歌浏览器还是IE浏览器等
     28 
     29         #第二步:向第一步中的url发送http请求,要用到requests模块
     30         #这个模块的安装,在PyCharm的Terminal命令行中输入 pip install requests 命令
     31         #response = requests.get(url,headers = headers)
     32         response = requests.get(url,headers = headers,params = data,timeout = 10)
     33         #这里为啥要用GET请求呢,,因为在Headers栏中Request Method:GET  是这里决定的,我们就是在模拟浏览器呢,所以浏览器用get,我们也要用get
     34         #请求完之后一定会收到数据,所以需要定义一个变量接受url返回的数据
     35         #response中是很多数据的,很多个信息打包在一起,想要把里边的信息拿出来,就需要把这个包裹拆开
     36         #如果想从这个包裹中读取到文本信息该如何操作呢?
     37         #print(response.text)         #这text就是html的所有内容了,就这样获取了
     38         ''' 打印信息如下:
     39         <html>
     40         <head>
     41             <script>
     42                 location.replace(location.href.replace("https://","http://"));
     43             </script>
     44         </head>
     45         <body>
     46             <noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
     47         </body>
     48         </html>
     49         '''
     50         #很明显出问题了,并没有返回什么实质性的信息,返回的数据太简单了
     51         #出了什么问题呢?
     52         #一个陌生的人打电话找你借钱,你肯定不给,,这里就涉及到网站的反爬,只会把信息返回给合法的用户,百度有反爬手段拒绝爬虫的
     53         #百度的反爬手段是,在发送http请求的时候,额外带一点信息,把自己的身份带上
     54         #服务器会根据身份监测 这个请求是不是合法用户发出来的,如果什么都不写,requests会自己带一个信息,告诉对端服务器,我是requests,服务器一看是个爬虫,就不返回信息给它
     55         #所以我们要进行一个伪装,伪装一个请求头,,第三步的内容
     56         #做好请求头之后,把这个headers作为get()的参数,然后再执行脚本,返回的信息就正常了
     57 
     58         #获取到test信息后,现在再过一遍原理,理解一下为什么要这么干
     59 
     60 
     61         #第四步:进行数据清洗
     62         html = response.text
     63         #divs = re.findall(r'<div class="result c-container ".*?</div>',html,re.S)  #需要复习一下正则表达式
     64         #re.S的作用,如果想让 正则表达式中的.去匹配不可见字符(换行、回车、空格等)就要带这个参数
     65         #divs是一个列表
     66         #print(divs[0])
     67         '''
     68         <div class="result c-container " id="1" srcid="1599" tpl="se_com_default"  data-click="{'rsv_bdr':'0' ,'rsv_cd':'pt:40520|vLevel:3'}"  ><h3 class="t"><a
     69                     data-click="{
     70                     'F':'778317EA',
     71                     'F1':'9D73F1E4',
     72                     'F2':'4CA6DD6B',
     73                     'F3':'54E5343F',
     74                     'T':'1525198098',
     75                                 'y':'3FF3A3FD'
     76 
     77                                             }"
     78                 href = "http://www.baidu.com/link?url=dQVdrt2_fgdyKqB1oMjo_CLMibztqwK8-azppn9_Zl8nwZv70cbvRBTuwE4ZqOminSBbbw2-L0Qp5s4ZLQDqujuypHKS1SD4LcOd1S3Rm2PH3Zhz5-vMq1Enkh86pgWV"
     79 
     80                             target="_blank"
     81 
     82                 ><em>程序设计</em>_百度百科</a></h3><div class="c-abstract"><span class=" newTimeFactor_before_abs m">2015年11月29日&nbsp;-&nbsp;</span><em>程序设计</em>是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。<em>程序设计</em>往往以某种<em>程序设计</em>语言为工具,给出这种语言下的程序。<em>程序设计</em>过程...</div>
     83 
     84         '''
     85         #接下来就要获取 href 中的内容,又要写正则表达式了,就是把上边这个url补充完整
     86         urls = re.findall(r'<div class="result c-container ".*?"(http://www.baidu.com/link?url=.*?)".*?</div>',html,re.S)
     87         #print(urls[0])
     88         #http://www.baidu.com/link?url=zQPLyCOSZWMjz8StrMmgIX5KuIsBnYhCC7vhya7nKbfF9JLvvOqRhYQ2q742zvIzkp2mzoa2REoeaB-b0KO-fSiMlr00E-uXTupL-r2KT0K0w9AfkjCZkcytUOkZ8XQG
     89 
     90         #打印所有的URL
     91         #for url in urls:
     92         #    print(url)
     93 
     94         #http://www.baidu.com/link?url=K0lSFkZ8icMPLoTxXZKvJ_3l0Vt6pVV03ddlCE8Bp37
     95 
     96         #http://www.baidu.com/link?url=K0lSFkZ8icMPLoTxXZKvJ_3l0Vt6pVV03ddlCE8Bp37
     97         #真正的url 是 url=K0lSFkZ8icMPLoTxXZKvJ_3l0Vt6pVV03ddlCE8Bp37,,如何获取这部分内容呢?
     98         #这里就体现了requests的强大之处,如果是urllib的话还要处理跳转
     99 
    100         #获取真实url 获取重定向的url
    101         #for url in urls:
    102         #    res = requests.get(url,headers = headers)
    103         #    print(res.url)     #这一步就获取了真实url
    104 
    105         #http://www.bccn.net/
    106 
    107 
    108         #上边数据清洗完之后就要做数据持久化了
    109         #数据持久化 把数据写入到res/程序设计.txt中
    110         #这种方式只能写字符串到文本中
    111 
    112         #数据持久化 写到文本中
    113         #fb = open('res\程序设计.txt','w',encoding='utf-8')
    114 
    115         #fb = open('res\{}.txt'.format(key), 'a', encoding='utf-8')  # 优化点3
    116         #获取真实url 获取重定向的url 访问
    117         #for url in urls:     #为了避免同名变量的覆盖,同一个文件中尽量不要使用同名的变量
    118         for b_url in urls:
    119             res = requests.get(b_url,headers = headers)
    120             print(res.url)
    121             fb.write(res.url)
    122             fb.write('
    ')            ##write()方法需要手动换行,还可以用writeline()替换
    123 
    124         #fb.close()
    125 
    126     fb.close()
    127 
    128 
    129 #下一步考虑优化
    130 #优化点 1   这个url被写死了,如果想爬取其他东西该怎么办呢
    131 #优化点 2   防止某个url获取的过程太耗时,可以设置timeout = 10
    132 #优化点 3   根据爬取关键字的不同,动态根据关键字生成不同的文件
    133 #优化点 4   翻页,所有的翻页都是a标签  pn=   用for循环为pn赋值
    134 #优化点 5   如果要自定义爬取关键字、爬取的页数,把上面这段代码封装成函数
    135 #优化点 6   为了避免频繁打开关闭文件,把文件打开关闭操作放在for循环外
    136 
    137 
    138 #如果需要同时爬取多个关键字,可以用for循环,还可以自定义每个关键字的爬取页数
    139 keys = {'正则表达式':5,'美女':'10','爬虫':12}
    140 for key,value in keys.items():
    141     baidu_spider(key,value)

    整理后的代码:

    #!/user/bin/env python
    # -*- coding:utf-8 -*-
    # author:隔壁老王
    
    import requests
    import re
    
    def baidu_spider(key,pn):
        url = 'https://www.baidu.com/s?&rsv_spt=1&rsv_iqid=0x967855b80019cdd1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_sug3=3&rsv_sug1=2&rsv_sug7=100&inputT=643536&rsv_sug4=644636'
        fb = open('res\{}.txt'.format(key), 'w', encoding='utf-8')
        for i in range(pn):
    
            data = {'wd':key,'pn': i * 10}
    
            headers = {
                'User-Agent':r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
            }
    
            response = requests.get(url,headers = headers,params = data,timeout = 10)
    
            html = response.text
    
            urls = re.findall(r'<div class="result c-container ".*?"(http://www.baidu.com/link?url=.*?)".*?</div>',html,re.S)
    
            for b_url in urls:
                res = requests.get(b_url,headers = headers)
                print(res.url)
                fb.write(res.url)
                fb.write('
    ')
    
        fb.close()
    
    
    
    keys = {'正则表达式':5,'爬虫':12}
    for key,value in keys.items():
        baidu_spider(key,value)
  • 相关阅读:
    迭代器和生成器
    案例:复制大文件
    案例:使用seek倒查获取日志文件的最后一行
    Leetcode165. Compare Version Numbers比较版本号
    Leetcode137. Single Number II只出现一次的数字2
    Leetcode129. Sum Root to Leaf Numbers求根到叶子节点数字之和
    Leetcode116. Populating Next Right Pointers in Each Node填充同一层的兄弟节点
    Leetcode114. Flatten Binary Tree to Linked List二叉树展开为链表
    Leetcode113. Path Sum II路径总和2
    C++stl中vector的几种常用构造方法
  • 原文地址:https://www.cnblogs.com/avention/p/8981625.html
Copyright © 2011-2022 走看看