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

参考

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

【python爬虫】根据查询词爬取网站返回结果

时间: 2024-10-12 09:09:57

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

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

大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不好使,八成是正则表达式那儿匹配不到了,请更改一下正则,当然最主要的还是帮助大家理解思路. 2016/12/2 本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件 1.URL格式的确定 首先,我们先观察一下百度贴吧的任意一个帖子. 比如:ht

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

静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件

Python爬虫新手教程:爬取了6574篇文章,告诉你产品经理在看什么!

作为互联网界的两个对立的物种,产品汪与程序猿似乎就像一对天生的死对头:但是在产品开发链条上紧密合作的双方,只有通力合作,才能更好地推动项目发展.那么产品经理平日里面都在看那些文章呢?我们程序猿该如何投其所好呢?我爬取了人人都是产品经理栏目下的所有文章,看看产品经理都喜欢看什么. 1. 分析背景 1.1. 为什么选择「人人都是产品经理」 人人都是产品经理是以产品经理.运营为核心的学习.交流.分享平台,集媒体.培训.招聘.社群为一体,全方位服务产品人和运营人,成立8年举办在线讲座500+期,线下分享

Python爬虫系列 - 初探:爬取旅游评论

Python爬虫目前是基于requests包,下面是该包的文档,查一些资料还是比较方便. http://docs.python-requests.org/en/master/ 爬取某旅游网站的产品评论,通过分析,获取json文件需要POST指令.简单来说: GET是将需要发送的信息直接添加在网址后面发送 POST方式是发送一个另外的内容到服务器 那么通过POST发送的内容可以大概有三种,即form.json和multipart,目前先介绍前两种 1.content in form Content

python爬虫--2019中国好声音评论爬取

2019中国好声音火热开播,作为一名"假粉丝",这一季每一期都刷过了,尤其刚播出的第六期开始正式的battle.视频视频看完了,那看下大家都是怎样评论的. 1.网页分析部分 本文爬取的是腾讯视频评论,第六期的评论地址是:http://coral.qq.com/4093121984每页有10条评论,点击"查看更多评论",可将新的评论加载进来,通过多次加载,可以发现我们要找的评论就在以v2开头的js类型的响应中. 请求为GET请求,地址是http://coral.qq.

Python爬虫实战教程:爬取网易新闻;爬虫精选 高手技巧

前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. stars声明很多小伙伴学习Python过程中会遇到各种烦恼问题解决不了.为此小编建了个群 624440745. 不懂的问题有老司机解决里面还有最新Python教程项目可拿,,一起相互监督共同进步! 此文属于入门级级别的爬虫,老司机们就不用看了. 本次主要是爬取网易新闻,包括新闻标题.作者.来源.发布时间.新闻正文. 首先我们打开163的网站,我们随意选择一个分类,这里我选

Python 爬虫入门实例(爬取小米应用商店的top应用apk)

一,爬虫是什么? 爬虫就是获取网络上各种资源,数据的一种工具.具体的可以自行百度. 二,如何写简单爬虫 1,获取网页内容 可以通过 Python(3.x) 自带的 urllib,来实现网页内容的下载.实现起来很简单 import urllib.request url="http://www.baidu.com" response=urllib.request.urlopen(url) html_content=response.read() 还可以使用三方库 requests ,实现起

Python爬虫之利用正则表达式爬取内涵吧

首先,我们来看一下,爬虫前基本的知识点概括 一. match()方法: 这个方法会从字符串的开头去匹配(也可以指定开始的位置),如果在开始没有找到,立即返回None,匹配到一个结果,就不再匹配. 我们可以指定开始的位置的索引是3,范围是3-10,那么python将从第4个字符'1'开始匹配,只匹配一个结果. group()获得一个或多个分组的字符串,指定多个字符串时将以元组的形式返回,group(0)代表整个匹配的字串,不填写参数时,group()返回的是group(0). 1 import r

Python爬虫之简单的爬取百度贴吧数据

首先要使用的第类库有 urllib下的request  以及urllib下的parse  以及 time包  random包 之后我们定义一个名叫BaiduSpider类用来爬取信息 属性有 url:用来爬取的网址             headers:请求头 class BaiduSpider(object): def __init__(self): self.url = 'http://tieba.baidu.com/f?kw={}&pn={}' self.headers = {'User