设为首页 收藏本站
查看: 2208|回复: 0

[经验分享] 【python爬虫】根据查询词爬取网站返回结果

[复制链接]

尚未签到

发表于 2015-4-22 09:59:02 | 显示全部楼层 |阅读模式
  最近在做语义方面的问题,需要反义词。就在网上找反义词大全之类的,但是大多不全,没有我想要的。然后就找相关的网站,发现了http://fanyici.xpcha.com/5f7x868lizu.html,还行能把“老师”-“学生”,“医生”-“病人”这样对立关系的反义词查出来。
DSC0000.jpg
  一开始我想把网站中数据库中存在的所有的词语都爬出来(暗网爬虫),但是分析了url的特点:
  http://fanyici.xpcha.com/5f7x868lizu.html
  查询词和非阴影部分的剩余的7个位置有关,如果暴力破解的发,总共(26+10)^7=78364164096~780亿个url有很多没用的。写了个爬虫爬,感觉太慢了,暂时放弃了这种想法,想用模拟浏览器的方式,根据查询词的存储查询结果。在网上找了很多资料,终于搞定。
  
  使用的是mechanize模块,它是非常适合的模拟浏览器模块。可以利用该模块完成一些浏览器想要做的事,比如自动填写表单。主要特点:


  • http,https协议等
  • 简单的HTML表单填写
  • 浏览器历史记录和重载
  • Referer的HTTP头的正确添加(可选)
  • 自动遵守robots.txt的
  • 自动处理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’,是通过分析网站的源码获得,如下图
DSC0001.jpg
  
  3. 解析需要的内容
  这里利用了BeautifulSoup模块,更详细看这里



def parseHtml(html):
'''
@summary: 抓取结构化数据
'''
content = ""
wordpattern = '(.+?)的反义词'
pattern = '(.+?)'
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 = '(.+?)的反义词'
pattern = '(.+?)'
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
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59511-1-1.html 上篇帖子: Python入门笔记(11):集合 下篇帖子: 【循序渐进学Python】13.基本的文件I/O
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表