python不能用谷歌浏览器 python调用谷歌浏览器报错
大家好,今天小编来为大家解答以下的问题,关于python不能用谷歌浏览器,python调用谷歌浏览器报错这个很多人还不知道,现在让我们一起来看看吧!
本文目录
一、python 新浪微博爬虫,求助
因为参加学校大学生创新竞赛,研究有关微博博文表达的情绪,需要大量微博博文,而网上无论是国内的某度、csdn,还是国外谷歌、gayhub、codeproject等都找不到想要的程序,没办法只能自己写一个程序了。
ps.在爬盟找到类似的程序,但是是windows下的,并且闭源,而且最终爬取保存的文件用notepad++打开有很多奇怪的问题,所以放弃了。
本程序由Python写成,所以基本的python知识是必须的。另外,如果你有一定的计算机网络基础,在前期准备时会有少走很多弯路。
1.对爬取对象分类,可以分为以下几种:第一种是不需要登录的,比如博主以前练手时爬的中国天气网,这种网页爬取难度较低,建议爬虫新手爬这类网页;第二种是需要登录的,如豆瓣、新浪微博,这些网页爬取难度较高;第三种独立于前两种,你想要的信息一般是动态刷新的,如AJAX或内嵌资源,这种爬虫难度最大,博主也没研究过,在此不细举(据同学说淘宝的商品评论就属于这类)。
2.如果同一个数据源有多种形式(比如电脑版、手机版、客户端等),优先选取较为“纯净的”展现。比如新浪微博,有网页版,也有手机版,而且手机版可以用电脑浏览器访问,这时我优先选手机版新浪微博。
3.爬虫一般是将网页下载到本地,再通过某些方式提取出感兴趣的信息。也就是说,爬取网页只完成了一半,你还要将你感兴趣的信息从下载下来的html文件中提取出来。这时就需要一些xml的知识了,在这个项目中,博主用的是XPath提取信息,另外可以使用XQuery等等其他技术,详情请访问w3cschool。
4.爬虫应该尽量模仿人类,现在网站反爬机制已经比较发达,从验证码到禁IP,爬虫技术和反爬技术可谓不断博弈。
决定了爬虫的目标之后,首先应该访问目标网页,明确目标网页属于上述几种爬虫的哪种,另外,记录为了得到感兴趣的信息你需要进行的步骤,如是否需要登录,如果需要登录,是否需要验证码;你要进行哪些操作才能获得希望得到的信息,是否需要提交某些表单;你希望得到的信息所在页面的url有什么规律等等。
以下博文以博主项目为例,该项目爬取特定新浪微博用户从注册至今的所有微博博文和根据关键词爬取100页微博博文(大约1000条)。
首先访问目标网页,发现需要登录,进入登录页面如下新浪微博手机版登录页面
注意url后半段有很多形如”%xx”的转义字符,本文后面将会讲到。
从这个页面可以看到,登录新浪微博手机版需要填写账号、密码和验证码。
这个验证码是近期(本文创作于2016.3.11)才需要提供的,如果不需要提供验证码的话,将有两种方法进行登录。
第一种是填写账号密码之后执行js模拟点击“登录”按钮,博主之前写过一个Java爬虫就是利用这个方法,但是现在找不到工程了,在此不再赘述。
第二种需要一定HTTP基础,提交包含所需信息的HTTP POST请求。我们需要Wireshark工具来抓取登录微博时我们发出和接收的数据包。如下图我抓取了在登录时发出和接收的数据包Wireshark抓取结果1
在搜索栏提供搜索条件”http”可得到所有http协议数据包,右侧info显示该数据包的缩略信息。图中蓝色一行是POST请求,并且info中有”login”,可以初步判断这个请求是登录时发出的第一个数据包,并且这个180.149.153.4应该是新浪微博手机版登录认证的服务器IP地址,此时我们并没有任何的cookie。
在序号为30是数据包中有一个从该IP发出的HTTP数据包,里面有四个Set-Cookie字段,这些cookie将是我们爬虫的基础。
早在新浪微博服务器反爬机制升级之前,登录是不需要验证码的,通过提交POST请求,可以拿到这些cookie,在项目源码中的TestCookie.py中有示例代码。
ps.如果没有wireshark或者不想这么麻烦的话,可以用浏览器的开发者工具,以chrome为例,在登录前打开开发者工具,转到Network,登录,可以看到发出和接收的数据,登录完成后可以看到cookies,如下图chrome开发者工具
接下来访问所需页面,查看页面url是否有某种规律。由于本项目目标之一是获取某用户的全部微博,所以直接访问该用户的微博页面,以央视新闻为例。
图为央视新闻微博第一页,观察该页面的url可以发现,新浪微博手机版的微博页面url组成是“weibo.cn/(displayID)?page=(pagenum)”。这将成为我们爬虫拼接url的依据。
接下来查看网页源码,找到我们希望得到的信息的位置。打开浏览器开发者工具,直接定位某条微博,可以发现它的位置,如下所示。
观察html代码发现,所有的微博都在<div>标签里,并且这个标签里有两个属性,其中class属性为”c”,和一个唯一的id属性值。得到这个信息有助于将所需信息提取出来。
另外,还有一些需要特别注意的因素
*按照发布时间至当前时间的差距,在页面上有”MM分钟前”、”今天HH:MM”、”mm月dd日 HH:MM”、”yyyy-mm-dd HH:MM:SS”等多种显示时间的方式*手机版新浪微博一个页面大约显示10条微博,所以要注意对总共页数进行记录以上几点都是细节,在爬虫和提取的时候需要仔细考虑。
本项目开发语言是Python 2.7,项目中用了一些第三方库,第三方库可以用pip的方法添加。
既然程序自动登录的想法被验证码挡住了,想要访问特定用户微博页面,只能使用者提供cookies了。
首先用到的是Python的request模块,它提供了带cookies的url请求。
print request.get(url, cookies=cookies).content使用这段代码就可以打印带cookies的url请求页面结果。
首先取得该用户微博页面数,通过检查网页源码,查找到表示页数的元素,通过XPath等技术提取出页数。
项目使用lxml模块对html进行XPath提取。
首先导入lxml模块,在项目里只用到了etree,所以from lxml import etree
html= requests.get(url, cookies=self.cook).content# Visit the first page to get the page number.
pagenum= selector.xpath('//input[@name="mp"]/@value')[0]
接下来就是不断地拼接url->访问url->下载网页。
需要注意的是,由于新浪反爬机制的存在,同一cookies访问页面过于“频繁”的话会进入类似于“冷却期”,即返回一个无用页面,通过分析该无用页面发现,这个页面在特定的地方会出现特定的信息,通过XPath技术来检查这个特定地方是否出现了特定信息即可判断该页面是否对我们有用。
title= selector.xpath('//title')[0]
return title.text!='微博广场' and title.text!='微博'
如果出现了无用页面,只需简单地重新访问即可,但是通过后期的实验发现,如果长期处于过频访问,返回的页面将全是无用页面,程序也将陷入死循环。为了避免程序陷入死循环,博主设置了尝试次数阈值trycount,超过这个阈值之后方法自动返回。
下面代码片展示了单线程爬虫的方法。
def startcrawling(self, startpage=1, trycount=20):
os.mkdir(sys.path[0]+'/Weibo_raw/'+ self.wanted)except Exception, e:
while not isdone and attempt< trycount:
while not isneeded and attempt< trycount:
html= self.getpage(self.geturl(i))
isneeded= self.ispageneeded(html)
self.savehtml(sys.path[0]+'/Weibo_raw/'+ self.wanted+'/'+ str(i)+'.txt', html)print str(i)+'/'+ str(pagenum- 1)
考虑到程序的时间效率,在写好单线程爬虫之后,博主也写了多线程爬虫版本,基本思想是将微博页数除以线程数,如一个微博用户有100页微博,程序开10个线程,那么每个线程只负责10个页面的爬取,其他基本思想跟单线程类似,只需仔细处理边界值即可,在此不再赘述,感兴趣的同学可以直接看代码。另外,由于多线程的效率比较高,并发量特别大,所以服务器很容易就返回无效页面,此时trycount的设置就显得更重要了。博主在写这篇微博的时候,用一个新的cookies,多线程爬取现场测试了一下爬取北京邮电大学的微博,3976条微博全部爬取成功并提取博文,用时仅15s,实际可能跟cookies的新旧程度和网络环境有关,命令行设置如下,命令行意义在项目网址里有说明python main.py _T_WM=xxx; SUHB=xxx; SUB=xxx; gsid_CTandWM=xxx u bupt m 20 20爬取的工作以上基本介绍结束,接下来就是爬虫的第二部分,解析了。由于项目中提供了多线程爬取方法,而多线程一般是无序的,但微博博文是依靠时间排序的,所以项目采用了一种折衷的办法,将下载完成的页面保存在本地文件系统,每个页面以其页号为文件名,待爬取的工作结束后,再遍历文件夹内所有文件并解析。
通过前面的观察,我们已经了解到微博博文存在的标签有什么特点了,利用XPath技术,将这个页面里所有有这个特点的标签全部提取出来已经不是难事了。
在这再次提醒,微博分为转发微博和原创微博、时间表示方式。另外,由于我们的研究课题仅对微博文本感兴趣,所以配图不考虑。
def startparsing(self, parsingtime=datetime.datetime.now()):
basepath= sys.path[0]+'/Weibo_raw/'+ self.uidfor filename in os.listdir(basepath):
if filename.startswith('.'):
path= basepath+'/'+ filename
weiboitems= selector.xpath('//div[@class="c"][@id]')for item in weiboitems:
weibo.id= item.xpath('./@id')[0]
cmt= item.xpath('./div/span[@class="cmt"]')if len(cmt)!= 0:
ctt= item.xpath('./div/span[@class="ctt"]')[0]
for a in ctt.xpath('./a'):
reason= cmt[1].text.split(u'\xa0')
ct= item.xpath('./div/span[@class="ct"]')[0]
time= ct.text.split(u'\xa0')[0]
weibo.time= self.gettime(self, time, parsingtime)self.weibos.append(weibo.__dict__)
方法传递的参数parsingtime的设置初衷是,开发前期爬取和解析可能不是同时进行的(并不是严格的“同时”),微博时间显示是基于访问时间的,比如爬取时间是10:00,这时爬取到一条微博显示是5分钟前发布的,但如果解析时间是10:30,那么解析时间将错误,所以应该讲解析时间设置为10:00。到后期爬虫基本开发完毕,爬取工作和解析工作开始时间差距降低,时间差将是爬取过程时长,基本可以忽略。
解析结果保存在一个列表里,最后将这个列表以json格式保存到文件系统里,删除过渡文件夹,完成。
f= open(sys.path[0]+'/Weibo_parsed/'+ self.uid+'.txt','w')jsonstr= json.dumps(self.weibos, indent=4, ensure_ascii=False)f.write(jsonstr)
同样的,收集必要的信息。在微博手机版搜索页面敲入”python”,观察url,研究其规律。虽然第一页并无规律,但是第二页我们发现了规律,而且这个规律可以返回应用于第一页第一页
观察url可以发现,对于关键词的搜索,url中的变量只有keyword和page(事实上,hideSearchFrame对我们的搜索结果和爬虫都没有影响),所以在代码中我们就可以对这两个变量进行控制。
另外,如果关键词是中文,那么url就需要对中文字符进行转换,如我们在搜索框敲入”开心”并搜索,发现url如下显示搜索开心
幸好,python的urllib库有qoute方法处理中文转换的功能(如果是英文则不做转换),所以在拼接url前使用这个方法处理一下参数。
另外,考虑到关键词搜索属于数据收集阶段使用的方法,所以在此只提供单线程下载网页,如有多线程需要,大家可以按照多线程爬取用户微博的方法自己改写。最后,对下载下来的网页进行提取并保存(我知道这样的模块设计有点奇怪,打算重(xin)构(qing)时(hao)时再改,就先这样吧)。
def keywordcrawling(self, keyword):
realkeyword= urllib.quote(keyword)# Handle the keyword in Chinese.
os.mkdir(sys.path[0]+'/keywords')
highpoints= re.compile(u'[\U00010000-\U0010ffff]')# Handle emoji, but it seems doesn't work.
highpoints= re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')pagenum= 0
html= self.getpage(' realkeyword)isneeded= self.ispageneeded(html)
pagenum= int(selector.xpath('//input[@name="mp"]/@value')[0])except:
for i in range(1, pagenum+ 1):
html= self.getpage('(realkeyword, str(i)))isneeded= self.ispageneeded(html)
weiboitems= selector.xpath('//div[@class="c"][@id]')for item in weiboitems:
cmt= item.xpath('./div/span[@class="cmt"]')if(len(cmt))== 0:
ctt= item.xpath('./div/span[@class="ctt"]')[0]
text= etree.tostring(ctt, method='text', encoding="unicode")tail= ctt.tail
text= highpoints.sub(u'\u25FD', text)# Emoji handling, seems doesn't work.
print str(i)+'/'+ str(pagenum)
f= open(sys.path[0]+'/keywords/'+ keyword+'.txt','w')try:
f.write(json.dumps(weibos,indent=4,ensure_ascii=False))except Exception,ex:
博主之前从未写过任何爬虫程序,为了获取新浪微博博文,博主先后写了3个不同的爬虫程序,有Python,有Java,爬虫不能用了是很正常的,不要气馁,爬虫程序和反爬机制一直都在不断博弈中,道高一尺魔高一丈。
另.转载请告知博主,如果觉得博主帅的话就可以不用告知了
二、Python爬虫是什么
为自动提取网页的程序,它为搜索引擎从万维网上下载网页。
网络爬虫为一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索。
1、由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。
2、按照网页内容目录层次深浅来爬行页面,处于较浅目录层次的页面首先被爬行。当同一层次中的页面爬行完毕后,爬虫再深入下一层继续爬行。
3、文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能。
参考资料来源:百度百科-网络爬虫
三、python怎么响应后端发送get,post请求的接口
测试用CGI,名字为test.py,放在apache的cgi-bin目录下:
print"Content-type: text/html\n"
if form.has_key("ServiceCode") and form["ServiceCode"].value!="":
print"<h1> Hello",form["ServiceCode"].value,"</h1>"
print"<h1> Error! Please enter first name.</h1>"
使用get方式时,请求数据直接放在url中。
url=""
res_data= urllib2.urlopen(req)
url=""
conn= httplib.HTTPConnection("192.168.81.16")
conn.request(method="GET",url=url)
使用post方式时,数据放在data或者body中,不能放在url中,放在url中将被忽略。
test_data={'ServiceCode':'aaaa','b':'bbbbb'}
test_data_urlencode= urllib.urlencode(test_data)
requrl=""
req= urllib2.Request(url= requrl,data=test_data_urlencode)
res_data= urllib2.urlopen(req)
test_data={'ServiceCode':'aaaa','b':'bbbbb'}
test_data_urlencode= urllib.urlencode(test_data)
requrl=""
headerdata={"Host":"192.168.81.16"}
conn= httplib.HTTPConnection("192.168.81.16")
conn.request(method="POST",url=requrl,body=test_data_urlencode,headers= headerdata)
对python中json的使用不清楚,所以临时使用了urllib.urlencode(test_data)方法;
模块urllib,urllib2,httplib的区别
httplib实现了http和https的客户端协议,但是在python中,模块urllib和urllib2对httplib进行了更上层的封装。
httplib.HTTPConnection(host[,port[,stict[,timeout]]])
这个是构造函数,表示一次与服务器之间的交互,即请求/响应
host标识服务器主机(服务器IP或域名)
strict模式是False,表示无法解析服务器返回的状态行时,是否抛出BadStatusLine异常
conn= httplib.HTTPConnection("192.168.81.16",80)与服务器建立链接。
2、HTTPConnection.request(method,url[,body[,header]])函数
method请求的方式,一般是post或者get,
url请求的资源,请求的资源(页面或者CGI,我们这里是CGI)
url=""请求CGI
url=""请求页面
body需要提交到服务器的数据,可以用json,也可以用上面的格式,json需要调用json模块
headers请求的http头headerdata={"Host":"192.168.81.16"}
test_data={'ServiceCode':'aaaa','b':'bbbbb'}
test_data_urlencode= urllib.urlencode(test_data)
requrl=""
headerdata={"Host":"192.168.81.16"}
conn= httplib.HTTPConnection("192.168.81.16",80)
conn.request(method="POST",url=requrl,body=test_data_urlencode,headers= headerdata)
conn在使用完毕后,应该关闭,conn.close()
3、HTTPConnection.getresponse()函数
这个是获取http响应,返回的对象是HTTPResponse的实例。
read([amt])获取响应消息体,amt表示从响应流中读取指定字节的数据,没有指定时,将全部数据读出;
getheader(name[,default])获得响应的header,name是表示头域名,在没有头域名的时候,default用来指定返回值
getheaders()以列表的形式获得header
date=response.getheader('date');
resheader=response.getheaders();
[('content-length','295'),('accept-ranges','bytes'),('server','Apache'),('last-modified','Sat,31Mar201210:07:02GMT'),('connection','close'),('etag','"e8744-127-4bc871e4fdd80"'),('date','Mon,03Sep201210:01:47GMT'),('content-type','text/html')]
date=response.getheader('date');
******************************************************************************************************************************************************************************************************************************************************
所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。
类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求的内容发送到服务器端,然后读取服务器端的响应资源。
在Python中,我们使用urllib2这个组件来抓取网页。
urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。
它以urlopen函数的形式提供了一个非常简单的接口。
最简单的urllib2的应用代码只需要四行。
我们新建一个文件urllib2_test01.py来感受一下urllib2的作用:
response= urllib2.urlopen(';)
我们可以打开百度主页,右击,选择查看源代码(火狐OR谷歌浏览器均可),会发现也是完全一样的内容。
也就是说,上面这四行代码将我们访问百度时浏览器收到的代码们全部打印了出来。
这就是一个最简单的urllib2的例子。
除了"http:",URL同样可以使用"ftp:","file:"等等来替代。
客户端提出请求,服务端提供应答。
urllib2用一个Request对象来映射你提出的HTTP请求。
在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,
通过调用urlopen并传入Request对象,将返回一个相关请求response对象,
这个应答对象如同一个文件对象,所以你可以在Response中调用.read()。
我们新建一个文件urllib2_test02.py来感受一下:
req= urllib2.Request(';)
response= urllib2.urlopen(req)
可以看到输出的内容和test01是一样的。
urllib2使用相同的接口处理所有的URL头。例如你可以像下面那样创建一个ftp请求。
req= urllib2.Request(';)
在HTTP请求时,允许你做额外的两件事。
这个内容相信做过Web端的都不会陌生,
有时候你希望发送一些数据到URL(通常URL与CGI[通用网关接口]脚本,或其他WEB应用程序挂接)。
在HTTP中,这个经常使用熟知的POST请求发送。
这个通常在你提交一个HTML表单时由你的浏览器来做。
并不是所有的POSTs都来源于表单,你能够使用POST提交任意的数据到你自己的程序。
一般的HTML表单,data需要编码成标准形式。然后做为data参数传到Request对象。
编码工作使用urllib的函数而非urllib2。
我们新建一个文件urllib2_test03.py来感受一下:
url=';
values={'name':'WHY',
'location':'SDU',
'language':'Python'}
data= urllib.urlencode(values)#编码工作
req= urllib2.Request(url, data)#发送请求同时传data表单
response= urllib2.urlopen(req)#接受反馈的信息
the_page= response.read()#读取反馈的内容
如果没有传送data参数,urllib2使用GET方式的请求。
GET和POST请求的不同之处是POST请求通常有"副作用",
它们会由于某种途径改变系统状态(例如提交成堆垃圾到你的门口)。
Data同样可以通过在Get请求的URL本身上面编码来传送。
data['name']='WHY'
data['location']='SDU'
data['language']='Python'
url_values= urllib.urlencode(data)
name=Somebody+Here&language=Python&location=Northampton
url=';
full_url= url+'?'+ url_values
这样就实现了Data数据的Get传送。
有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器。
默认的urllib2把自己作为“Python-urllib/x.y”(x和y是Python主版本和次版本号,例如Python-urllib/2.7),
这个身份可能会让站点迷惑,或者干脆不工作。
浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。
下面的例子发送跟上面一样的内容,但把自身模拟成Internet Explorer。
(多谢大家的提醒,现在这个Demo已经不可用了,不过原理还是那样的)。
url=';
user_agent='Mozilla/4.0(compatible; MSIE 5.5; Windows NT)'
values={'name':'WHY',
'location':'SDU',
'language':'Python'}
headers={'User-Agent': user_agent}
data= urllib.urlencode(values)
req= urllib2.Request(url, data, headers)
response= urllib2.urlopen(req)
以上就是python利用urllib2通过指定的URL抓取网页内容的全部内容,非常简单吧,希望对大家能有所帮助
python不能用谷歌浏览器的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于python调用谷歌浏览器报错、python不能用谷歌浏览器的信息别忘了在本站进行查找哦。
声明:信息资讯网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,版权归原作者东方体育日报所有。若您的权利被侵害,请联系 删除。
本文链接:http://www.gdxhedu.com/news/179226.html