分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

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

发布时间:2023-09-06 01:52责任编辑:苏小强关键词:爬虫

需要结合:《百度搜索引擎关键字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 获取重定向的url101 ????????#for url in urls:102 ????????# ???res = requests.get(url,headers = headers)103 ????????# ???print(res.url) ????#这一步就获取了真实url104 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‘) ?# 优化点3116 ????????#获取真实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(‘\n‘) ???????????##write()方法需要手动换行,还可以用writeline()替换123 124 ????????#fb.close()125 126 ????fb.close()127 128 129 #下一步考虑优化130 #优化点 1 ??这个url被写死了,如果想爬取其他东西该怎么办呢131 #优化点 2 ??防止某个url获取的过程太耗时,可以设置timeout = 10132 #优化点 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 requestsimport redef 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采集爬虫优化行业定投方案高效获得行业流量-代码篇

原文地址:https://www.cnblogs.com/avention/p/8981625.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved