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

 #!/user/bin/env python
# -*- coding:utf-8 -*-
# author:隔壁老王 import requests
import re def baidu_spider(key,pn):
#第一步:确认目标URL: 百度搜索“程序设计”的url
#key = '正则表达式'
#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'
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'
#优化点 1 这个url被写死了,如果想爬取其他东西该怎么办呢
fb = open('res\\{}.txt'.format(key), 'w', encoding='utf-8') # 优化点3
#优化点 4 实现翻页
for i in range(pn): #还有一个请求参数
data = {'wd':key,'pn': i * 10} #wd=%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1 这个其实就是“程序设计”,是被编码成这样子的,搜索的关键字 #第三步:伪装请求头,
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'
}
#字典中的信息在Headers栏的Request Headers下的User-Agent :用来标识用户类型,是谷歌浏览器还是IE浏览器等 #第二步:向第一步中的url发送http请求,要用到requests模块
#这个模块的安装,在PyCharm的Terminal命令行中输入 pip install requests 命令
#response = requests.get(url,headers = headers)
response = requests.get(url,headers = headers,params = data,timeout = 10)
#这里为啥要用GET请求呢,,因为在Headers栏中Request Method:GET 是这里决定的,我们就是在模拟浏览器呢,所以浏览器用get,我们也要用get
#请求完之后一定会收到数据,所以需要定义一个变量接受url返回的数据
#response中是很多数据的,很多个信息打包在一起,想要把里边的信息拿出来,就需要把这个包裹拆开
#如果想从这个包裹中读取到文本信息该如何操作呢?
#print(response.text) #这text就是html的所有内容了,就这样获取了
''' 打印信息如下:
<html>
<head>
<script>
location.replace(location.href.replace("https://","http://"));
</script>
</head>
<body>
<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
</body>
</html>
'''
#很明显出问题了,并没有返回什么实质性的信息,返回的数据太简单了
#出了什么问题呢?
#一个陌生的人打电话找你借钱,你肯定不给,,这里就涉及到网站的反爬,只会把信息返回给合法的用户,百度有反爬手段拒绝爬虫的
#百度的反爬手段是,在发送http请求的时候,额外带一点信息,把自己的身份带上
#服务器会根据身份监测 这个请求是不是合法用户发出来的,如果什么都不写,requests会自己带一个信息,告诉对端服务器,我是requests,服务器一看是个爬虫,就不返回信息给它
#所以我们要进行一个伪装,伪装一个请求头,,第三步的内容
#做好请求头之后,把这个headers作为get()的参数,然后再执行脚本,返回的信息就正常了 #获取到test信息后,现在再过一遍原理,理解一下为什么要这么干 #第四步:进行数据清洗
html = response.text
#divs = re.findall(r'<div class="result c-container ".*?</div>',html,re.S) #需要复习一下正则表达式
#re.S的作用,如果想让 正则表达式中的.去匹配不可见字符(换行、回车、空格等)就要带这个参数
#divs是一个列表
#print(divs[0])
'''
<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
data-click="{
'F':'778317EA',
'F1':'9D73F1E4',
'F2':'4CA6DD6B',
'F3':'54E5343F',
'T':'1525198098',
'y':'3FF3A3FD' }"
href = "http://www.baidu.com/link?url=dQVdrt2_fgdyKqB1oMjo_CLMibztqwK8-azppn9_Zl8nwZv70cbvRBTuwE4ZqOminSBbbw2-L0Qp5s4ZLQDqujuypHKS1SD4LcOd1S3Rm2PH3Zhz5-vMq1Enkh86pgWV" target="_blank" ><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> '''
#接下来就要获取 href 中的内容,又要写正则表达式了,就是把上边这个url补充完整
urls = re.findall(r'<div class="result c-container ".*?"(http://www.baidu.com/link\?url=.*?)".*?</div>',html,re.S)
#print(urls[0])
#http://www.baidu.com/link?url=zQPLyCOSZWMjz8StrMmgIX5KuIsBnYhCC7vhya7nKbfF9JLvvOqRhYQ2q742zvIzkp2mzoa2REoeaB-b0KO-fSiMlr00E-uXTupL-r2KT0K0w9AfkjCZkcytUOkZ8XQG #打印所有的URL
#for url in urls:
# print(url) #http://www.baidu.com/link?url=K0lSFkZ8icMPLoTxXZKvJ_3l0Vt6pVV03ddlCE8Bp37 #http://www.baidu.com/link?url=K0lSFkZ8icMPLoTxXZKvJ_3l0Vt6pVV03ddlCE8Bp37
#真正的url 是 url=K0lSFkZ8icMPLoTxXZKvJ_3l0Vt6pVV03ddlCE8Bp37,,如何获取这部分内容呢?
#这里就体现了requests的强大之处,如果是urllib的话还要处理跳转 #获取真实url 获取重定向的url
#for url in urls:
# res = requests.get(url,headers = headers)
# print(res.url) #这一步就获取了真实url #http://www.bccn.net/ #上边数据清洗完之后就要做数据持久化了
#数据持久化 把数据写入到res/程序设计.txt中
#这种方式只能写字符串到文本中 #数据持久化 写到文本中
#fb = open('res\\程序设计.txt','w',encoding='utf-8') #fb = open('res\\{}.txt'.format(key), 'a', encoding='utf-8') # 优化点3
#获取真实url 获取重定向的url 访问
#for url in urls: #为了避免同名变量的覆盖,同一个文件中尽量不要使用同名的变量
for b_url in urls:
res = requests.get(b_url,headers = headers)
print(res.url)
fb.write(res.url)
fb.write('\n') ##write()方法需要手动换行,还可以用writeline()替换 #fb.close() fb.close() #下一步考虑优化
#优化点 1 这个url被写死了,如果想爬取其他东西该怎么办呢
#优化点 2 防止某个url获取的过程太耗时,可以设置timeout = 10
#优化点 3 根据爬取关键字的不同,动态根据关键字生成不同的文件
#优化点 4 翻页,所有的翻页都是a标签 pn= 用for循环为pn赋值
#优化点 5 如果要自定义爬取关键字、爬取的页数,把上面这段代码封装成函数
#优化点 6 为了避免频繁打开关闭文件,把文件打开关闭操作放在for循环外 #如果需要同时爬取多个关键字,可以用for循环,还可以自定义每个关键字的爬取页数
keys = {'正则表达式':5,'美女':'','爬虫':12}
for key,value in keys.items():
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('\n') fb.close() keys = {'正则表达式':5,'爬虫':12}
for key,value in keys.items():
baidu_spider(key,value)

百度搜索引擎关键字URL采集爬虫优化行业定投方案高效获得行业流量-代码篇的更多相关文章

  1. 爬虫任务二:爬取(用到htmlunit和jsoup)通过百度搜索引擎关键字搜取到的新闻标题和url,并保存在本地文件中(主体借鉴了网上的资料)

    采用maven工程,免着到处找依赖jar包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&quo ...

  2. Python大黑阔—url采集+exp验证,带你批量测试

    i春秋作家:大木瓜 前言: 最近几天在整理从各处收集来的各种工具包,大大小小的塞满了十几个G的硬盘,无意间发现了一个好几年前的0day.心血来潮就拿去试了一下,没想到真的还可以用,不过那些站点都已经老 ...

  3. 2015最新百度搜索引擎(seo优化)排名算法

    多少年来,对于弄清百度排名算法成为了一代又一代站长的最高目标.随着百度推出了搜索引擎网页质量**,直接揭开了神秘的百度排名算法,这是作为站长福音啊.现在小编就来为大家介绍一下. 首先想要得到直接需要的 ...

  4. PHP获取搜索引擎关键字来源(百度、谷歌、雅虎、搜狗、搜搜、必应、有道)

    <?php //获取来自搜索引擎入站时的关键词 function get_keyword($url,$kw_start) { $start=stripos($url,$kw_start); $u ...

  5. 网站SEO优化如何让百度搜索引擎绝的你的网站更有抓取和收录价值呢?_孙森SEO

    今天孙森SEO为大家唠唠网站到底该如何优化才会让百度搜索引擎绝的你的网站更有抓取和收录价值呢? 第一方面:网站创造高品质的内容,可以为用户提供独特的价值. 1.百度作为搜索引擎,网站内容必须满足 搜索 ...

  6. WebCollector爬取百度搜索引擎样例

    使用WebCollector来爬取百度搜索引擎依照关键字搜索的结果页面,解析规则可能会随百度搜索的改版而失效. 代码例如以下: package com.wjd.baidukey.crawler; im ...

  7. ASP.NET MVC URL重写与优化(1)-使用Global路由表定制URL

    ASP.NET MVC URL重写与优化(1)-使用Global路由表定制URL 引言--- 在现今搜索引擎制霸天下的时代,我们不得不做一些东西来讨好爬虫,进而提示网站的排名来博得一个看得过去的流量. ...

  8. discuz X3.1的门户文章实现伪静态,利于搜索引擎收录url的地址修改

    最近在捣鼓DZ框架,这两天发现文章的收录情况并不是太理想,做了很多优化方面的工作,今天主要解决了DZ门户的文章链接伪静态化,在这次修改之前,也做过一次在网上找的静态化修改,之前做的方式是: 1.在DZ ...

  9. Python大法之告别脚本小子系列—各类URL采集器编写

    本文作者:i春秋签约作家——阿甫哥哥 系列文章专辑:https://bbs.ichunqiu.com/forum.php?mod=collection&action=view&ctid ...

随机推荐

  1. 【OI】同余方程

    一.同余方程的判定 我们知道同余方程是形如 ax ≡ b (mod n)   的东西,用文字表达就是: ax和b除以n的余数相同 那么,经过如下推理:(用=代替恒等于) ax=b (mod n) ax ...

  2. Linux 学习之路:认识shell和bash

    一.shell  计算机硬件的直接控制者是操作系统的内核(kernel),因为内核的重要性,所以作为用户的我们是无法直接操作内核的,所以我们需要shell调用应用程序或者双击打开安装的应用软件与内核之 ...

  3. git reset --hard 回滚以后 以后怎么再回去?

    恢复的过程很简单: 通过git log -g命令来找到需要恢复的信息对应的commitid,可以通过提交的时间和日期来辨别,找到执行reset --hard之前的那个commit对应的commitid ...

  4. typescript 入门例子 Hello world——ts就是一个宿主机语言

    安装 TypeScript TypeScript 的命令行工具安装方法如下: npm install -g typescript 安装完成之后,就有了 tsc 命令.编译一个 TypeScript 文 ...

  5. windows 下 opencv 3.x 的安装及常见问题的解决

    1. 下载与配置 下载地址:Releases - OpenCV library(选择合适的平台和版本) 配置步骤见:VS 2013 统一修改所有工程的目录配置(以 boost.opencv3 的安装为 ...

  6. java SWing事件调用的两种机制

      Java(91)  /** * java swing中事件调用的两种机制: * (一)响应机制 * (二)回调机制 */ package test; import java.awt.*; impo ...

  7. Hotel booking(spfa+floyd)

    http://acm.hdu.edu.cn/showproblem.php?pid=2992 题意:有n个城市,编号为(1~n),有一些城市中有一些旅店,要求从一个城市到另一个城市不能超过10小时,问 ...

  8. 能够完成qq信息提醒的代码

    下面这个网址就帮咱们实现了QQ提醒的功能,别被它的外面吓坏,虽然是长的有点恶心,但是它可是一段“神奇代码”. http://qzs.qq.com/snsapp/app/bee/widget/open. ...

  9. 开启和安装Kubernetes 基于Docker For Windows

    0.最近发现,Docker For Windows Stable在Enable Kubernetes这个问题上是有Bug的,建议切换到Edge版本,并且采用下文AliyunContainerServi ...

  10. Python/Django 下载Excel2007

    一.前提 上一篇,我写了下载Excel2003的博文,这里写下载Excel2007的博文的原因有三: 第一.Excel2003基本已经淘汰了 第二.Excel2003下载文件太大,不利于网络传输 第三 ...