百度网页关键字抓取(两篇之后,重点还是分析过程分析些什么呢:)

优采云 发布时间: 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结果就这么多了!

  谢谢观看!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线