百度网页关键字抓取(两篇之后,重点还是分析过程分析些什么呢:)
优采云 发布时间: 2021-10-24 17:09百度网页关键字抓取(两篇之后,重点还是分析过程分析些什么呢:)
写了两篇文章,想到爬虫,重点是分析过程
分析什么:
1)首先明确你要爬取什么
比如这次我们需要抓取所有使用百度搜索后的url结果
2)分析获取目标的手动过程,以便在程序中实现
比如在百度上,我们先输入关键词进行搜索,然后百度会在搜索结果页面反馈给我们,我们一一点击查询
3)想想方案是怎么实现的,克服具体的实现难点
那么我们先按照上面的步骤,我们先识别搜索引擎,提供一个搜索框供用户输入,然后点击执行
我们可以先模拟搜索,发现点击搜索后一个完整的url很重要,如下
搜索内容...
我们尝试去掉下面的内容,再次请求上面的URL,发现返回的信息是一样的,可以断定请求的URL只需要填写wd参数即可。
那么我们应该尝试requests.get()看看页面是否可以正常返回,防止百度反爬虫
嘿嘿,还好正常返回页面哈哈~
(当然,如果你不返回正常信息,只需设置标题或严格的cookies。)
*敏*感*词*请求
url=''r=requests.get(url)print r.status_code,r.content
好的,接下来我们想知道如何抓取所有结果
我们再次分析了url,发现url中还有一个关键项,就是控制页码的项:
这个x是每10页,第一页为0,一共76页,也就是750的最大值,如果大于750,返回第一页
接下来,我们可以分析抓取的页面
仍然使用友好的beautifulsoup
通过分析,我们发现我们需要的URL在标签a中的href中,格式是这样的:
因为还有很多其他的url混淆,我们只需要进行一个过滤就可以了。
而且得到的url并不是我们想要的url结果,这只是一个来自百度的重定向链接
但是让我欣慰的是,当我们团队对这个跳转链接进行get请求时,直接返回get对象的url就是我们想要的结果链接。
然后我们又试了一下,发现还是没有其他的反爬虫机制哈哈
原来的想法是我们是要先过滤新url返回的状态码,还是不是200就不行(甚至需要一些header)
但是我发现即使不是200,我们只需要返回请求对象的url,是否可以正常返回都没有关系。
因为我们的目的不是请求的页面结果,而是请求的url
所以把它全部打印出来
当然我推荐写一个简单的通用headers来get,这样至少可以去掉一些不必要的结果
那么我们请求的完整思路就差不多了
在代码上:
#coding=utf-8
importrequestsimportsysimportQueueimportthreadingfrom bs4 importBeautifulSoup as bsimportre
标题={
......
}classbaiduSpider(threading.Thread):def __init__(self,queue,name):
threading.Thread.__init__(self)
self._queue=队列
self._name=namedefrun(self):while notself._queue.empty():
url=self._queue.get() 试试:
self.get_url(url)exceptException,e:printepass
#一定要处理异常!!!否则会中途停止,抓取的内容不完整!!!
defget_url(self,url):
r = requests.get(url = url,headers =headers)
汤 = bs(r.content,"html.parser")
urls=soup.find_all(name='a',attrs={'href':pile(('.'))})#for i in urls:#print i
#抓取百度搜索结果中的a标签,其中href是百度的重定向地址
对于 i inurls:if'/link?url=' in i['href']:
a= requests.get(url = i['href'],headers =headers)# 访问重定向地址,返回访问的url,得到我们需要抓取的url结果
#if a.status_code == 200:
#打印一个.url
with open('E:/url/'+self._name+'.txt') as f:if a.url not inf.read():
f = open('E:/url/'+self._name+'.txt','a')
f.write(a.url+'\n')
f.close()defmain(keyword):
名称=关键字
f = open('E:/url/'+name+'.txt','w')
f.close()
queue=Queue.Queue() for i in range(0,760,10):
queue.put(``%(keyword,str(i)))
线程=[]
线程数 = 10
对于我范围内(thread_count):
蜘蛛=百度蜘蛛(队列,名称)
threads.append(spider)for i inthreads:
i.start() for i inthreads:
i.join()print "它挂了,先生!"
if __name__ =='__main__':if len(sys.argv) != 2:print'no keyword'
print'请输入关键字'sys.exit(-1)else:
主要(sys.argv [1])
我们工具的功能是:
python 123.py 关键字
可以将url结果写入文件
我有话要说 sys
在if __name__ =='__main__'中判断:首先,如果输入字段为1,那么我们将返回提示信息,让用户输入
如果有两个,则记录第二个输入作为操作的关键字
当然这里的逻辑有一个缺陷,就是超过两个字符会不会有其他问题(其他问题!!!)
值得研究,但这不是我们文章的重点
好了,今天的百度url结果就这么多了!
谢谢观看!