python爬取网页(设置headers2)

来源:互联网 发布:店铺如何关闭淘宝客 编辑:程序博客网 时间:2024/05/16 02:42

      

    今天用python爬取糗事百科的笑料时,发现用前面学的方法竟然不好用了.........

就是这样:

def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

html = getHtml("http://www.qiushibaike.com/hot/")

     运行到这一步就会出错,也就是说 urllib.urlopen(url)不能读取这个网址,上网一查,才发现还有什么动态网页和静态网页之分(好吧,表示以前都没听说过,计算机小白一枚。。。),前边学习的方法只适用于一般的静态网页。对于这种情况,我们需要设置headers属性。

#############################

    在这之前先补充一个知识点:构造request属性

就是在上面的urlopen()中的参数可以传入一个request请求,它是Request类的一个实例,构造是需要加入URL,data等,比如上面程序可以改写为:

def getHtml(url):

    request = urllib2.Request(url)
    page = urllib.urlopen(request)
    html = page.read()
    return html

这个写法运行结果和前边是完全一样的,以后推荐这种写法,因为后边需要时还要向request对象中传入其它参数。

##################################

 一、下面看一下追加的headers的方法。

import urllib
import urllib2
import re


url = "http://www.qiushibaike.com/hot/"

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'#这两个是传入headers中的参数,具体什么意思我也不太懂

headers = { 'User-Agent' : user_agent } #设置headers

request = urllib2.Request(url,headers=headers)#request的构造

page = urllib2.urlopen(request)
html = page.read()

reg = '<div class="content">[\n]*<span>(.*?)</span>'
page_reg = re.compile(reg)
artlist = re.findall(page_reg,html)
for art in artlist:
    print art

二、另一种设置headers的方法是:

url = "http://www.qiushibaike.com/hot/"

request = urllib2.Request(url)
request.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)') #追加header
page = urllib2.urlopen(request)
html = page.read()

下面一样。

    最后附上整个代码:

# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
url = "http://www.qiushibaike.com/hot/"
request = urllib2.Request(url,headers=headers)
page = urllib2.urlopen(request)
html = page.read()
reg = '<div class="content">[\n]*<span>(.*?)</span>[\n]*</div>[\n]</a>[\n]*'
reg += '<div class="thumb">[\n]*<a href="/article/.*?" target="_blank">[\n]'
reg += '<img src="(.*\.jpg)" alt=".*?" />[\n]</a>[\n]*</div>[\n]*'
reg += '<div class="stats">[\n]<span class="stats-vote"><i class="number">(.*?)</i> .*?</span>[\n]'
reg += '<span class="stats-comments">[\n]*<span class="dash">.*?</span>[\n]'
reg += '<a href="/article/.*?" data-share="/article/.*?" id="c-.*?" class="qiushi_comments" target="_blank">'
reg += '[\n]<i class="number">(.*?)</i> .*?[\n]</a>'
page_reg = re.compile(reg)
artlist = re.findall(page_reg,html)
flag = True
while flag:
    for art in artlist:
        input_cha = raw_input() #点回车继续
        if input_cha == "Q": #点Q键退出
            flag = False
            break
        print art[0]
        print u"点赞:%s\n评论:%s" %(art[2],art[3])


这里大家可能会发现上次用了urllib,这次怎么用了urllib2,这两个有什么区别吗?

    其实它们的区别是:urllib只能根据url爬取,不能设置headers信息,但可以对url进行编码。而urllib2可以构造request,设置headers信息。这些知识以前没接触过,所以难免有什么遗漏不足之处,随着学习慢慢修改完善。


0 0
原创粉丝点击