zoukankan      html  css  js  c++  java
  • 【python爬虫】根据查询词爬取网站返回结果

    最近在做语义方面的问题,需要反义词。就在网上找反义词大全之类的,但是大多不全,没有我想要的。然后就找相关的网站,发现了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 + '	'
            for key in temp:
                content += key + '	'
    
        content = content.strip('	')
        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 + '	'
            for key in temp:
                content += key + '	'
    
        content = content.strip('	')
        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

  • 相关阅读:
    android ListView加载不同布局
    实例演示如何在spring4.2.2中集成hibernate5.0.2并创建sessionFactory
    【翻译】Ext JS最新技巧——2015-10-21
    Android Studio下使用NDK的流程
    Android Studio JNI javah遇到的问题
    题解报告:hdu 1062 Text Reverse
    题解报告:hdu 1039 Easier Done Than Said?
    ACM_逆序数(归并排序)
    hdu 1556 Color the ball(区间修改,单点查询)
    hdu 1754 I Hate It(线段树)
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3725877.html
Copyright © 2011-2022 走看看