[python爬虫]根据查询词爬取网站返回结果


查询词和非阴影部分的剩余的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’,是通过分析网站的源码获得,如下图
 
 
 
 
 
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“中。

评论关闭