Python入门学习:模拟浏览器查询百度获取结果

  • 时间:
  • 浏览:0
  • 来源:知而不乎

本来学习Python就是想和SEO相关的,所以就在学习的时候把一下常见的需求引进来,这样动力大,学起来就快一些,深刻一些了。SEO最常用的的恐怕就是查询关键词的排名了,手动查询又慢,有个好工具那肯定是梦寐以求的,那就开始了。
首先需要引人两个模块:

  1. import urllib.request
  2. from bs4 import BeautifulSoup

然后就是通过关键词,构造查询的URL:

  1. keywords = '胜利日阅兵安排'
  2. wd = urllib.request.quote(keywords)
  3. url = 'http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&ch=12&tn=56060048_4_pg&wd='+wd
  4. url = url+'&rsv_pq=ff64d901000031d4&rsv_t=1b7cB%2FKAQLLDfettJz2WrartM10yMWFSwzgBoHAmYV2X6Dv3mqbDMJyJyfplrLpO%2BP8XKA&rsv_enter=1&rsv_sug3=5&rsv_sug1=4&rsv_sug2=0&inputT=6285&rsv_sug4=11467'

要提交获取搜索结果前,必须要构造一个HTTP请求的头,否则是无法返回数据的。构造header就是定义一个字典:

  1. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
  2. 'Accept':'text/html;q=0.9,*/*;q=0.8',
  3. 'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
  4. 'Accept-Encoding':'gzip',
  5. 'Connection':'close',
  6. 'Referer':None #注意如果依然不能抓取的话,这里可以设置抓取网站的host
  7. }

然后构造一个请求,把header的数据加进去,打开网页的时候一起提交:

  1. opener = urllib.request.build_opener()
  2. opener.addheaders = [headers]
  3.  
  4. page = urllib.request.urlopen(url).read().decode('utf-8')

获取了页面源代码后,需要将它转为BeautifulSoup 4对象方便操作提取数据:

  1. html = BeautifulSoup(page)

接着就可以开始取数了,这个过程比较复杂,还有部分的不能正确提取,大多数是百度的其他产品,非自然结果,先暂时返回无法获取,有时间再慢慢的提取。

开始代码前先下个页面来研究一下规律:

每条结果都会存在一个div id=”,id是唯一的,接着就是h3是结果的标题,百科是h4,然后提取描述,正常的描述会在一个class=’abstract’的div下的p里面,百科会没有P标签,然后就是提取URL了,正常会在class=’g’的span里,特殊点的暂时找到在class=’op-bk-polysemy-move’的p里面。

基本就这些规律,更复杂的需要查询更多的结果来分析总结,先写个一般的能用的就行了。

然后用循环把结果打印出来。

  1. for i in range(1,11):
  2. res = html.find(id=i)
  3. print('第',i,'条结果:')
  4. if res.h3 != None:
  5. print(res.h3.get_text(strip=True))
  6. elif res.h4 != None:
  7. print(res.h4.get_text(strip=True))
  8. else:
  9. print('无法提取标题')
  10. if res.find('div',class_='c-abstract') !=None:
  11. print(res.find('div',class_='c-abstract').get_text(strip=True))
  12. elif res.find('div',class_='c-span18') !=None:
  13. if res.find('div',class_='c-span18').p !=None:
  14. print(res.find('div',class_='c-span18').p.get_text(strip=True))
  15. else:
  16. print(res.find('div',class_='c-span18').get_text(strip=True))
  17. else:
  18. print('无法提取描述')
  19. if res.find('span',class_='g') != None:
  20. print('网站:',res.find('span',class_='g').get_text(strip=True).split('/')[0])
  21. elif res.find('p',class_='op-bk-polysemy-move') !=None:
  22. print('网站:',res.find('p',class_='op-bk-polysemy-move').get_text(strip=True).split('/')[0])
  23. else:
  24. print('无法提取网址')
  25. print('\n')

另外,为了查第二页的结果,我们还要提取一下下一页的URL,再读出第二页的数据:

  1. nextPage = html.find('a',class_='n').get('href')
  2. nextPage = 'http://www.baidu.com/'+nextPage
  3.  
  4. page = urllib.request.urlopen(nextPage).read().decode('utf-8')
  5.  
  6. html = BeautifulSoup(page)

然后再用上面的循环代码打印出第二页的结果。

总结:获取结果应该写成函数就好了,因为本身没有完善,而且把结果打印来看不好返回值,以后有时间再完善了。

猜你喜欢

百度李彦宏:将推“简单搜索”,永无广告

IT之家5月26日消息今日下午,2018中国国际大数据产业博览会今日在贵州召开。百度董事长兼CEO李彦宏在本次大会的“人工智能”环节出席,并发表了演讲。他展示了百度旗下的AI搜

2018-05-26

Python入门学习:使用http.cookiejar生产Cookie模拟用户登陆

有的网站,特别像社交网站,需要登陆才能抓取到网站的数据,那么光模拟浏览器请求网站内容是还不够了,还需要能够模拟用户登陆网站,然后保留登陆状态,获取网站相关的内容。想要成功模拟真

2018-05-17

Python入门学习:应用random函数随机生成HTTP请求headers信息

为什么抓取会收到限制要采集百度数据,查询关键词排名等,因为短时间内发出太多的请求,会受到百度局域网异常访问屏蔽策略的限制。出现以下错误信息:要突破这样的限制,必须伪装成为真正的

2018-05-17

Python入门学习:Beautiful Soup 4检查页面TDKH标签

环境:Python3.3.5beautifulsoup4-4.3.2Eclipse+PyDev利用BeautifulSoup4能够很方便的提取页面的标签,那我就来写一个检查页面

2018-05-17

python入门学习:采集搜狗下拉框联想词

最近在拿Python练手,单纯的学习又太枯燥,直接用来实现一些简单功能这样积极性高,效果会好点。环境:Python3.3.5+eclipse+pydev先上代码:#encodi

2018-05-17