python爬取百度搜索结果ur汇总
写了两篇之后,我觉得关于爬虫,重点还是分析过程
分析些什么呢:
1)首先明确自己要爬取的目标
比如这次我们需要爬取的是使用百度搜索之后所有出来的url结果
2)分析手动进行的获取目标的过程,以便以程序实现
比如百度,我们先进行输入关键词搜索,然后百度反馈给我们搜索结果页,我们再一个个进行点击查询
3)思考程序如何实现,并克服实现中的具体困难
那么我们就先按上面的步骤来,我们首先认识到所搜引擎,提供一个搜索框,让用户进行输入,然后点击执行
我们可以先模拟进行搜索,发现点击搜索之后的完整url中有一项很关键,如下
http://www.baidu.com/s?wd=搜索内容......
后面的内容我们尝试去除之后再次请求上面的url,发现返回的信息一样,我们就可以断定请求的url只需要填入wd这个参数即可
接着我们就应该进行尝试requests.get()查看是否能正常返回页面,防止百度的反爬虫
嘿,幸运的是返回页面正常哈哈~
(当然如果没有返回到正常信息,只要设置好headers或者严格的cookies就行了)
- import requests
- url = 'http://www.baidu.com/s?wd=......'
- r = requests.get(url)
- 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,这样至少能排除一些不必要的结果
接着我们请求的完整思路就差不多了
上代码:
- #coding=utf-8
- import requests
- import sys
- import Queue
- import threading
- from bs4 import BeautifulSoup as bs
- import re
- headers = {
- ......
- }
- class baiduSpider(threading.Thread):
- def __init__(self,queue,name):
- threading.Thread.__init__(self)
- self._queue = queue
- self._name = name
- def run(self):
- while not self._queue.empty():
- url = self._queue.get()
- try:
- self.get_url(url)
- except Exception,e:
- print e
- pass
- #一定要异常处理!!!不然中途会停下,爬取的内容就不完整了!!!
- def get_url(self,url):
- r = requests.get(url = url,headers = headers)
- soup = bs(r.content,"html.parser")
- urls = soup.find_all(name='a',attrs={'href':re.compile(('.'))})
- # for i in urls:
- # print i
- #抓取百度搜索结果中的a标签,其中href是包含了百度的跳转地址
- for i in urls:
- if 'www.baidu.com/link?url=' in i['href']:
- a = requests.get(url = i['href'],headers = headers)
- #对跳转地址进行一次访问,返回访问的url就能得到我们需要抓取的url结果了
- #if a.status_code == 200:
- #print a.url
- with open('E:/url/'+self._name+'.txt') as f:
- if a.url not in f.read():
- f = open('E:/url/'+self._name+'.txt','a')
- f.write(a.url+'\n')
- f.close()
- def main(keyword):
- name = keyword
- f = open('E:/url/'+name+'.txt','w')
- f.close()
- queue = Queue.Queue()
- for i in range(0,760,10):
- queue.put('http://www.baidu.com/s?wd=%s&pn=%s'%(keyword,str(i)))
- threads = []
- thread_count = 10
- for i in range(thread_count):
- spider = baiduSpider(queue,name)
- threads.append(spider)
- for i in threads:
- i.start()
- for i in threads:
- i.join()
- print "It's down,sir!"
- if __name__ == '__main__':
- if len(sys.argv) != 2:
- print 'no keyword'
- print 'Please enter keyword '
- sys.exit(-1)
- else:
- main(sys.argv[1])
我们工具的功能就是:
python 123.py keyword
就能将url结果写入文件
这边sys我有话讲
在if __name__ == '__main__':中先进行一个判断,如果输入的字段是一个,那么我们就返回提醒信息,让用户进行键入
如果是两个,那么就将第二个键入记为keyword进行操作
当然这边逻辑有个缺陷,就是大于两个字符会不会有别的问题(别的问题哦!!!)
值得研究一下,但这不是我们这篇的重点
好啦,今天的百度url结果手收集就那么多啦!
谢谢观看哦!
python爬取百度搜索结果ur汇总的更多相关文章
- python 爬取百度url
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2017-08-29 18:38:23 # @Author : EnderZhou (z ...
- Python——爬取百度百科关键词1000个相关网页
Python简单爬虫——爬取百度百科关键词1000个相关网页——标题和简介 网站爬虫由浅入深:慢慢来 分析: 链接的URL分析: 数据格式: 爬虫基本架构模型: 本爬虫架构: 源代码: # codin ...
- python爬取百度贴吧帖子
最近偶尔学下爬虫,放上第二个demo吧 #-*- coding: utf-8 -*- import urllib import urllib2 import re #处理页面标签类 class Too ...
- 爬虫实战(一) 用Python爬取百度百科
最近博主遇到这样一个需求:当用户输入一个词语时,返回这个词语的解释 我的第一个想法是做一个数据库,把常用的词语和词语的解释放到数据库里面,当用户查询时直接读取数据库结果 但是自己又没有心思做这样一个数 ...
- 假期学习【十一】Python爬取百度词条写入csv格式 python 2020.2.10
今天主要完成了根据爬取的txt文档,从百度分类从信息科学类爬取百度词条信息,并写入CSV格式文件. txt格式文件如图: 为自己爬取内容分词后的结果. 代码如下: import requests fr ...
- 使用python抓取百度搜索、百度新闻搜索的关键词个数
由于实验的要求,需要统计一系列的字符串通过百度搜索得到的关键词个数,于是使用python写了一个相关的脚本. 在写这个脚本的过程中遇到了很多的问题,下面会一一道来. ps:我并没有系统地学习过pyth ...
- 使用python爬取百度贴吧内的图片
1. 首先通过urllib获取网页的源码 # 定义一个getHtml()函数 def getHtml(url): try: page = urllib.urlopen(url) # urllib.ur ...
- python 爬取百度云资源
pan1 1 import urllib.request 2 import re 3 import random 4 5 def get_source(key): 6 7 print('请稍等,爬取中 ...
- python爬取百度翻译返回:{'error': 997, 'from': 'zh', 'to': 'en', 'query 问题
解决办法: 修改url为手机版的地址:http://fanyi.baidu.com/basetrans User-Agent也用手机版的 测试代码: # -*- coding: utf-8 -*- & ...
随机推荐
- python 算法 -- 冒泡排序
python 排序算法 -- 冒泡排序 原理 从数组的底部开始, 两两比较大小, 小的在下,大的在上, 依次类推直到顶部. 当整个数组比较完毕, 则最上面的一定是最大值(此即冒泡的由来); 当第一轮比 ...
- CSS3 @keyframes 规则
今天来给大家分享一下CSS3 @keyframes 规则! 在你了解CSS3 @keyframes 规则时我先来给大家说说什么是css3中的动画 动画是使元素从一种样式逐渐变化为另一种样式的效果. 您 ...
- Sql函数简单使用
),)) ) as begin ) --如果@nameA 不为空则直接返回@nameA IF @nameA <>'' BEGIN set @lastNameVal = @nameA END ...
- ci框架中输出sql语句
- JS组件系列——自己动手扩展BootstrapTable的 冻结列 功能:彻底解决高度问题
前言:一年前,博主分享过一篇关于bootstrapTable组件冻结列的解决方案 JS组件系列——Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案 ,通过该篇,确实可以实现bo ...
- [leetcode-521-Longest Uncommon Subsequence I]
Given a group of two strings, you need to find the longest uncommon subsequence of this group of two ...
- Kotlin入门第四课:简单工厂模式
Kotlin基础知识的学习,请参考之前的文章: Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次尝试用Kotlin实现Android ...
- C#设置WebBrowser默认浏览器
由于VS的WebBrowser控件的默认浏览器是IE7,好多网页兼容性不是很好,所以要修改下默认浏览器. 设置前: 设置后: 在WebBrowser界面加载时执行以下方法,设置浏览器. /// ...
- CSS 从入门到忘记
CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. 一. css的三种引入方式 二. css的选择器(Select ...
- 使用JDK自带的MessageDigest计算消息摘要
使用JDK自带的MessageDigest计算消息摘要 上代码 /** * 使用JDK自带MessageDigest */ public class MessageDigestUtils { /** ...