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)
  • 相关阅读:
    js事件冒泡替我背了很多黑锅 嘿嘿
    opencvmin函数
    关于Block Formatting Context--BFC和IE的hasLayout
    javascript面向对象包装类Class的类库解析
    nodejs中exports与module.exports的区别
    ie6固定定位层fixed
    CSS的类名交集复合选择器
    遮罩层覆盖整个页面
    nodejs的require模块及路径
    struts.properties配置详解
  • 原文地址:https://www.cnblogs.com/avention/p/8981625.html
Copyright © 2011-2022 走看看