【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 + '\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“中。

 





本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3725877.html,如需转载请自行联系原作者

相关文章
|
12天前
|
数据采集 存储 API
网络爬虫与数据采集:使用Python自动化获取网页数据
【4月更文挑战第12天】本文介绍了Python网络爬虫的基础知识,包括网络爬虫概念(请求网页、解析、存储数据和处理异常)和Python常用的爬虫库requests(发送HTTP请求)与BeautifulSoup(解析HTML)。通过基本流程示例展示了如何导入库、发送请求、解析网页、提取数据、存储数据及处理异常。还提到了Python爬虫的实际应用,如获取新闻数据和商品信息。
|
16天前
|
数据采集 Python
【python】爬虫-西安医学院-校长信箱
本文以西安医学院-校长信箱为基础来展示爬虫案例。来介绍python爬虫。
【python】爬虫-西安医学院-校长信箱
|
27天前
|
Python
Python实现简易天气查询系统
Python实现简易天气查询系统
28 4
|
22天前
|
数据采集 安全 Python
python并发编程:Python实现生产者消费者爬虫
python并发编程:Python实现生产者消费者爬虫
24 0
python并发编程:Python实现生产者消费者爬虫
|
2天前
|
数据采集 存储 JSON
Python爬虫面试:requests、BeautifulSoup与Scrapy详解
【4月更文挑战第19天】本文聚焦于Python爬虫面试中的核心库——requests、BeautifulSoup和Scrapy。讲解了它们的常见问题、易错点及应对策略。对于requests,强调了异常处理、代理设置和请求重试;BeautifulSoup部分提到选择器使用、动态内容处理和解析效率优化;而Scrapy则关注项目架构、数据存储和分布式爬虫。通过实例代码,帮助读者深化理解并提升面试表现。
11 0
|
5天前
|
数据采集 JavaScript 前端开发
使用Python打造爬虫程序之破茧而出:Python爬虫遭遇反爬虫机制及应对策略
【4月更文挑战第19天】本文探讨了Python爬虫应对反爬虫机制的策略。常见的反爬虫机制包括User-Agent检测、IP限制、动态加载内容、验证码验证和Cookie跟踪。应对策略包括设置合理User-Agent、使用代理IP、处理动态加载内容、验证码识别及维护Cookie。此外,还提到高级策略如降低请求频率、模拟人类行为、分布式爬虫和学习网站规则。开发者需不断学习新策略,同时遵守规则和法律法规,确保爬虫的稳定性和合法性。
|
16天前
|
数据采集 存储 前端开发
Python爬虫如何快速入门
写了几篇网络爬虫的博文后,有网友留言问Python爬虫如何入门?今天就来了解一下什么是爬虫,如何快速的上手Python爬虫。
20 0
|
21天前
|
前端开发 测试技术 数据库
【python】为什么使用python Django开发网站这么火?
【python】为什么使用python Django开发网站这么火?
|
30天前
|
数据采集 存储 Web App开发
一键实现数据采集和存储:Python爬虫、Pandas和Excel的应用技巧
一键实现数据采集和存储:Python爬虫、Pandas和Excel的应用技巧
|
1月前
|
数据采集 JSON 数据格式
python爬虫之app爬取-charles的使用
charles 基本原理,charles抓包,分析,重发。
53 0