最近在做语义方面的问题,需要反义词。就在网上找反义词大全之类的,但是大多不全,没有我想要的。然后就找相关的网站,发现了http://fanyici.xpcha.com/5f7x868lizu.html,还行能把“老师”-“学生”,“医生”-“病人”这样对立关系的反义词查出来。

一开始我想把网站中数据库中存在的所有的词语都爬出来(暗网爬虫),但是分析了url的特点:

http://fanyici.xpcha.com/5f7x868lizu.html

查询词和非阴影部分的剩余的7个位置有关,如果暴力破解的发,总共(26+10)^7=78364164096~780亿个url有很多没用的。写了个爬虫爬,感觉太慢了,暂时放弃了这种想法,想用模拟浏览器的方式,根据查询词的存储查询结果。在网上找了很多资料,终于搞定。

使用的是mechanize模块,它是非常适合的模拟浏览器模块。可以利用该模块完成一些浏览器想要做的事,比如自动填写表单。主要特点:

  1. http,https协议等
  2. 简单的HTML表单填写
  3. 浏览器历史记录和重载
  4. Referer的HTTP头的正确添加(可选)
  5. 自动遵守robots.txt的
  6. 自动处理HTTP-EQUIV和刷新

下面以解决该问题为导向,记录下完成步骤

0. 预备

环境:linux  python 2.7

安装模块:mechanize cookielib BeautifulSoup

1. 初始化并建立一个浏览器对象

import re
import sys
import mechanize
import cookielib
from bs4 import BeautifulSoup br = mechanize.Browser() ##建立浏览器对象
cj = cookielib.LWPCookieJar() ##通过导入cookielib模块,并设置浏览器cookie,可以在需要认证的网络行为之后不用重复认证登陆
br.set_cookiejar(cj) ##关联cookies
###设置一些参数,因为是模拟客户端请求,所以要支持客户端的一些常用功能,比如gzip,referer等
br.set_handle_equiv(True) 
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
###这个是degbug##你可以看到他中间的执行过程,对调试代码有帮助 
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.set_debug_http(True)
br.set_debug_redirects(True)
br.set_debug_responses(True)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]

2. 模拟浏览器的行为(获取web网页模拟网站查询)

r = br.open(sys.argv[1])
query = sys.argv[2] br.select_form(nr=0)
br.form['q'] = query
br.submit()
html = br.response().read()

这里选择的表单是nr=0,可以通过一下方式获取表单信息,从而利用需要的表单号。

for f in br.forms:
print f

查询词变量是’q’,是通过分析网站的源码获得,如下图

3. 解析需要的内容

这里利用了BeautifulSoup模块,更详细看这里

def parseHtml(html):
'''
@summary: 抓取结构化数据
'''
content = ""
wordpattern = '<h1>(.+?)的反义词</h1>'
pattern = '<span class="medium b">(.+?)</span>'
temp = re.findall(pattern, html)
wordtemp = re.search(wordpattern, html)
if temp:
word = wordtemp.group(1)
content = word + '\t'
for key in temp:
content += key + '\t' content = content.strip('\t')
return content

这样实现基本的功能可以了,参考代码(文件名为:crawler.py)

#! coding:utf-8
import re
import sys
import mechanize
import cookielib
from bs4 import BeautifulSoup def parseHtml(html):
'''
@summary: 抓取结构化数据
'''
content = ""
wordpattern = '<h1>(.+?)的反义词</h1>'
pattern = '<span class="medium b">(.+?)</span>'
temp = re.findall(pattern, html)
wordtemp = re.search(wordpattern, html)
if temp:
word = wordtemp.group(1)
content = word + '\t'
for key in temp:
content += key + '\t' content = content.strip('\t')
return content def saveData(data):
'''
@summary: 数据存储
'''
f = open('test', 'w')
f.write(data)
f.close() br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)##关联cookies ###设置一些参数,因为是模拟客户端请求,所以要支持客户端的一些常用功能,比如gzip,referer等
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False) br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) ###这个是degbug##你可以看到他中间的执行过程,对你调试代码有帮助
br.set_debug_http(True)
br.set_debug_redirects(True)
br.set_debug_responses(True) br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] r = br.open(sys.argv[1])
query = sys.argv[2] br.select_form(nr=0)
br.form['q'] = query
br.submit()
html = br.response().read()
data = parseHtml(html)
print data
if data != "":
saveData(data)

使用

python crawler.py  好

说明:最后一个为查询词,最终写到文件”test“中。

参考

http://blog.chinaunix.net/uid-26722078-id-3507409.html

【python爬虫】根据查询词爬取网站返回结果的更多相关文章

  1. python爬虫学习01--电子书爬取

    python爬虫学习01--电子书爬取 1.获取网页信息 import requests #导入requests库 ''' 获取网页信息 ''' if __name__ == '__main__': ...

  2. Python爬虫:为什么你爬取不到网页数据

    前言: 之前小编写了一篇关于爬虫为什么爬取不到数据文章(文章链接为:Python爬虫经常爬不到数据,或许你可以看一下小编的这篇文章), 但是当时小编也是胡乱编写的,其实里面有很多问题的,现在小编重新发 ...

  3. Python爬虫实战二之爬取百度贴吧帖子

    大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...

  4. Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  5. 转 Python爬虫实战二之爬取百度贴吧帖子

    静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 ...

  6. 转 Python爬虫实战一之爬取糗事百科段子

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

  7. python爬虫:了解JS加密爬取网易云音乐

    python爬虫:了解JS加密爬取网易云音乐 前言 大家好,我是"持之以恒_liu",之所以起这个名字,就是希望我自己无论做什么事,只要一开始选择了,那么就要坚持到底,不管结果如何 ...

  8. python爬虫入门10分钟爬取一个网站

    一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...

  9. 吴裕雄--天生自然PYTHON爬虫:使用Selenium爬取大型电商网站数据

    用python爬取动态网页时,普通的requests,urllib2无法实现.例如有些网站点击下一页时,会加载新的内容,但是网页的URL却没有改变(没有传入页码相关的参数),requests.urll ...

随机推荐

  1. 使用高德地图SDK获取定位信息

    使用高德地图SDK获取定位信息 第一步: 在高德官网下载SDK,如我这里需要获取定位信息,故仅下载"定位功能" 第二步: 注册成为开发者,并创建应用获取相应的key.其中,在使用A ...

  2. Object常用方法

    1.clone() 创建并返回对象的一个副本,要进行“克隆”的对象所属的类必须实现java.lang.Cloneable接口 2.equals() 功能:比较引用数据类型的等价性 等价标准:引用类型比 ...

  3. PostgreSQL中的引号和null

    今天工作时写了一个sql,但是PostgreSQL总是提示有语法错误,简单的做个记录:  问题1.'' 和“”单引号和双引号         举个例子: #.select id, delivery_d ...

  4. 新装Centos常见问题及解决方案

    1.可以ping通,但无法通过ssh连接虚拟机的解决方案 虚拟机上装了一个 Linux 玩玩, 但在启动 Linux 后,在 Windows 中通过 Xshell 以 SSH 方式连接到 Linux ...

  5. socket 套接字

    网络:交换机,路由器,网线 交换机:分配.. 路由器:找寻网络线路 网络架构: 应用层 ---> 表示层 ---> 会话层 ---> 传输层 ---> 网络层 ---> ...

  6. poj 1985 Cow Marathon 树的直径

    题目链接:http://poj.org/problem?id=1985 After hearing about the epidemic of obesity in the USA, Farmer J ...

  7. 【BZOJ】【3166】【HEOI2013】Alo

    可持久化Trie+set Orz zyf…… 搞区间中次大值不好搞,那么我们就反过来,找一个数,然后看它在哪些区间里是次大值…… (然而事实上我们并不用真的把这个区间具体是什么找见,只要知道它可以跟哪 ...

  8. date format 精辟讲解

    link: http://stackoverflow.com/questions/19533933/nsdateformatter-how-to-convert-wed-23-oct-2013-045 ...

  9. 对drupal的理解【转】

    写本文是想跟刚用drupal的朋友,分享一下心得,国内用drupal的太少了,希望大家能好好交流. 希望几分钟看完后你能马上上手drupal,至少能理解hook,api,theme,module,cc ...

  10. Python - 装饰器使用过程中的误区

    曾灵敏 - APRIL 27, 2015 装饰器基本概念 大家都知道装饰器是一个很著名的设计模式,经常被用于AOP(面向切面编程)的场景,较为经典的有插入日志,性能测试,事务处理,Web权限校验, C ...