写了两篇之后,我觉得关于爬虫,重点还是分析过程

分析些什么呢:

1)首先明确自己要爬取的目标

  比如这次我们需要爬取的是使用百度搜索之后所有出来的url结果

2)分析手动进行的获取目标的过程,以便以程序实现

  比如百度,我们先进行输入关键词搜索,然后百度反馈给我们搜索结果页,我们再一个个进行点击查询

3)思考程序如何实现,并克服实现中的具体困难

那么我们就先按上面的步骤来,我们首先认识到所搜引擎,提供一个搜索框,让用户进行输入,然后点击执行

我们可以先模拟进行搜索,发现点击搜索之后的完整url中有一项很关键,如下

http://www.baidu.com/s?wd=搜索内容......

后面的内容我们尝试去除之后再次请求上面的url,发现返回的信息一样,我们就可以断定请求的url只需要填入wd这个参数即可

接着我们就应该进行尝试requests.get()查看是否能正常返回页面,防止百度的反爬虫

嘿,幸运的是返回页面正常哈哈~

(当然如果没有返回到正常信息,只要设置好headers或者严格的cookies就行了)

  1. import requests
  2.  
  3. url = 'http://www.baidu.com/s?wd=......'
  4.  
  5. r = requests.get(url)
  6.  
  7. print r.status_code,r.content

好,接下来我们就想知道怎么爬取所有的结果

我么再次对url进行分析,发现url中还有一项很关键,是控制页码的项:

http://www.baidu.com/s?wd=...&pn=x

这个x是每10为一页,第一页为0,而且一共76页,也就是750最大值,大于750则返回第一页

接下来我们就可以对抓取到的页面进行分析

还是使用友好的beautifulsoup

我们通过分析发现我们所需要的url在标签a中的href里,而且格式是这样:

http://www.baidu.com/link?url=......

因为还存在很多别的url混淆,所以我们只需要进行一个筛选就行了

而且这个获得的url并不是我们想要的url结果,这只是百度的一个跳转链接

但是让我欣慰的是,当我们队这个跳转链接进行get请求后,直接返回get对象的url便是我们想要的结果链接了

然后我们再次进行尝试,发现还是没有别的反爬虫机制哈哈

本来的想法是,我们是否要先进行一个对新的url返回的状态码进行一个筛选,不是200就不行(甚至还需要些headers)

但是我发现,其实就算不是200,我们只要返回请求对象的url就行了,和能不能正常返回没关系

因为我们的目的并不是请求的页面结果,而是请求的url

所以只需要全部打印出来就行了

当然我建议写一个简单的笼统的headers写入get,这样至少能排除一些不必要的结果

接着我们请求的完整思路就差不多了

上代码:

  1. #coding=utf-8
  2.  
  3. import requests
  4. import sys
  5. import Queue
  6. import threading
  7. from bs4 import BeautifulSoup as bs
  8. import re
  9.  
  10. headers = {
  11. ......
  12. }
  13.  
  14. class baiduSpider(threading.Thread):
  15. def __init__(self,queue,name):
  16. threading.Thread.__init__(self)
  17. self._queue = queue
  18. self._name = name
  19.  
  20. def run(self):
  21. while not self._queue.empty():
  22. url = self._queue.get()
  23. try:
  24. self.get_url(url)
  25. except Exception,e:
  26. print e
  27. pass
  28. #一定要异常处理!!!不然中途会停下,爬取的内容就不完整了!!!
  29.  
  30. def get_url(self,url):
  31. r = requests.get(url = url,headers = headers)
  32. soup = bs(r.content,"html.parser")
  33. urls = soup.find_all(name='a',attrs={'href':re.compile(('.'))})
  34. # for i in urls:
  35. # print i
  36.  
  37. #抓取百度搜索结果中的a标签,其中href是包含了百度的跳转地址
  38.  
  39. for i in urls:
  40. if 'www.baidu.com/link?url=' in i['href']:
  41. a = requests.get(url = i['href'],headers = headers)
  42.  
  43. #对跳转地址进行一次访问,返回访问的url就能得到我们需要抓取的url结果了
  44.  
  45. #if a.status_code == 200:
  46. #print a.url
  47.  
  48. with open('E:/url/'+self._name+'.txt') as f:
  49. if a.url not in f.read():
  50. f = open('E:/url/'+self._name+'.txt','a')
  51. f.write(a.url+'\n')
  52. f.close()
  53.  
  54. def main(keyword):
  55.  
  56. name = keyword
  57.  
  58. f = open('E:/url/'+name+'.txt','w')
  59. f.close()
  60.  
  61. queue = Queue.Queue()
  62. for i in range(0,760,10):
  63. queue.put('http://www.baidu.com/s?wd=%s&pn=%s'%(keyword,str(i)))
  64.  
  65. threads = []
  66. thread_count = 10
  67.  
  68. for i in range(thread_count):
  69. spider = baiduSpider(queue,name)
  70. threads.append(spider)
  71.  
  72. for i in threads:
  73. i.start()
  74.  
  75. for i in threads:
  76. i.join()
  77.  
  78. print "It's down,sir!"
  79.  
  80. if __name__ == '__main__':
  81.  
  82. if len(sys.argv) != 2:
  83. print 'no keyword'
  84. print 'Please enter keyword '
  85.  
  86. sys.exit(-1)
  87. else:
  88. main(sys.argv[1])

我们工具的功能就是:

python 123.py keyword

就能将url结果写入文件

这边sys我有话讲

在if __name__ == '__main__':中先进行一个判断,如果输入的字段是一个,那么我们就返回提醒信息,让用户进行键入

如果是两个,那么就将第二个键入记为keyword进行操作

当然这边逻辑有个缺陷,就是大于两个字符会不会有别的问题(别的问题哦!!!)

值得研究一下,但这不是我们这篇的重点

好啦,今天的百度url结果手收集就那么多啦!

谢谢观看哦!

python爬取百度搜索结果ur汇总的更多相关文章

  1. python 爬取百度url

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2017-08-29 18:38:23 # @Author : EnderZhou (z ...

  2. Python——爬取百度百科关键词1000个相关网页

    Python简单爬虫——爬取百度百科关键词1000个相关网页——标题和简介 网站爬虫由浅入深:慢慢来 分析: 链接的URL分析: 数据格式: 爬虫基本架构模型: 本爬虫架构: 源代码: # codin ...

  3. python爬取百度贴吧帖子

    最近偶尔学下爬虫,放上第二个demo吧 #-*- coding: utf-8 -*- import urllib import urllib2 import re #处理页面标签类 class Too ...

  4. 爬虫实战(一) 用Python爬取百度百科

    最近博主遇到这样一个需求:当用户输入一个词语时,返回这个词语的解释 我的第一个想法是做一个数据库,把常用的词语和词语的解释放到数据库里面,当用户查询时直接读取数据库结果 但是自己又没有心思做这样一个数 ...

  5. 假期学习【十一】Python爬取百度词条写入csv格式 python 2020.2.10

    今天主要完成了根据爬取的txt文档,从百度分类从信息科学类爬取百度词条信息,并写入CSV格式文件. txt格式文件如图: 为自己爬取内容分词后的结果. 代码如下: import requests fr ...

  6. 使用python抓取百度搜索、百度新闻搜索的关键词个数

    由于实验的要求,需要统计一系列的字符串通过百度搜索得到的关键词个数,于是使用python写了一个相关的脚本. 在写这个脚本的过程中遇到了很多的问题,下面会一一道来. ps:我并没有系统地学习过pyth ...

  7. 使用python爬取百度贴吧内的图片

    1. 首先通过urllib获取网页的源码 # 定义一个getHtml()函数 def getHtml(url): try: page = urllib.urlopen(url) # urllib.ur ...

  8. python 爬取百度云资源

    pan1 1 import urllib.request 2 import re 3 import random 4 5 def get_source(key): 6 7 print('请稍等,爬取中 ...

  9. python爬取百度翻译返回:{'error': 997, 'from': 'zh', 'to': 'en', 'query 问题

    解决办法: 修改url为手机版的地址:http://fanyi.baidu.com/basetrans User-Agent也用手机版的 测试代码: # -*- coding: utf-8 -*- & ...

随机推荐

  1. vue组件大集合 component

    vue组件分为全局组件.局部组件和父子组件,其中局部组件只能在el定义的范围内使用, 全局组件可以在随意地方使用,父子组件之间的传值问题等. Vue.extend 创建一个组件构造器 template ...

  2. 初玩RAC

    之前因为项目的原因以及ReactiveCocoa框架导入到项目老是报错的原因,导致我这边一直没有能好好的将ReactiveCocoa运行起来,最近看了Hank老师的视频,而且项目中我们使用的就是OC, ...

  3. cesium自定义气泡窗口infoWindow后续优化篇

    http://www.cnblogs.com/giserhome/p/6248858.html该篇文章实现的自定义气泡窗口是基于修改cesium源代码基础上,这种做法只是援兵之计,凑合应付的,投机取巧 ...

  4. 用ingress的方式部署jenkins,启动后提示没有下载插件,未解决

    [root@node2 .docker]# docker logs 5c3dd117a10dRunning from: /usr/share/jenkins/jenkins.warwebroot: E ...

  5. Java学习笔记--反射API

    反射API 1.反射API的介绍 通过反射API可以获取Java程序在运行时刻的内部结构.比如Java类中包含的构造方法.域和方法等元素,并可以与这些元素进行交换.     按照 一般地面向对象的设计 ...

  6. Linux系统vi模式下显示行号

    在命令模式下输入:set nu或者:set number都可以为vi设置行号,如果要取消的话,则输入:set nonu行号的设置是vi的环境设置,不会影响文本的内容.

  7. Ion-affix & Ion-stick 仿IOS悬浮列表插件

    Ion-affix & Ion-stick 仿IOS悬浮列表插件 Ion-affix 1.相关网页 Ion-affix 2.环境准备: 执行命令 bower install ion-affix ...

  8. c# ActiveMQ 类

    using System;using System.Collections.Generic;using System.Text; using Apache.NMS;using Apache.NMS.A ...

  9. Android --> 常见控件

    1.TextView  主要用于界面上显示一段文本信息 2.Button  用于和用户交互的一个按钮控件 //为Button点击事件注册一个监听器public class Click extends ...

  10. [图形学] Chp9 三维几何变换--栈处理函数与矩阵管理函数的区别

    矩阵管理函数:glLoadIdentity()是把当前活动矩阵设置为单位矩阵. 栈处理函数:glPushMatrix()是将当前活动的变换矩阵复制一份,压入栈顶:glPopMatrix()是破坏当前活 ...