黑马程序员技术交流社区

标题: python抓取一个网页的源代码并存储到本地文件 [打印本页]

作者: suifeng199106    时间: 2019-7-15 13:35
标题: python抓取一个网页的源代码并存储到本地文件
1.1读取一个网页的源代码:

url:我们要爬取的网页链接(例如:url = “https://www.smpeizi.com”)

#读取一个网页的源代码

import urllib.request
def read_pageHtml(url):
    file = urllib.request.urlopen(url)
    data = file.read()
    return data

url = "https://www.pzzs168.com"
data = read_pageHtml(url)
print(data)


1.2将读取的网页内容存储到本地文件的两种常用办法:

方法一:

storagePath:存储的位置+文件名(例如:storagePath = "C:/Users/shijun/desktop/2.html")

data:抓取的网页信息


#将读取的网页以网页的形式存储到本地文件
def storageToLocalFiles(storagePath, data):
    fhandle = open(storagePath,"wb")
    fhandle.write(data)
    fhandle.close()

storagePath = "C:/Users/shijun/desktop/2.html"
data =    #我们获取的网页信息
storageToLocalFiles(storagePath, data)
运行结束之后我们就可以在桌面上看到一个网页了

方法二:

storagePath:存储的位置+文件名(例如:storagePath = "C:/Users/shijun/desktop/2.html")

url:我们要爬取的网页链接(例如:url = “https://www.idiancai.com”)


#将读取的网页以网页的形式存储到本地文件
def s(url, storagePath):
    import urllib.request
    filename = urllib.request.urlretrieve(url, filename=storagePath)




1.3一些常用指令

1.3.1:常用指令

file.info() : 读取当前环境相关信息

file.getcode():获取当前抓取网页的状态码

file.geturl():获取当前抓取网页的URL地址



1.3.2:编码问题

URL是有一定规则,或者说,我们的字符串是有一定的要求的(比如:只可以是字母、数字、下划线、部分符号等,如果有汉字的话,很可能就执行不了)。如果我们的字符串不符合要求,很可能就无法运行。那是不是没有解决办法呢。答案是NO!

我们可以用一个叫quote()的方法对字符串进行编码,然后就可以运行了。


import urllib.request

s = "hello everyone!"
data_quote = urllib.request.quote("hello everyone!")
print(data_quote)

data_unquote = urllib.request.unquote(data_quote)
print(data_unquote)
输出结果为:


hello%20everyone%21
hello everyone!




2浏览器的伪装

这里的伪装只是一些初步的伪装(日常应该够用了),主要是对用户身份(User-Agent)和信息来源网址(Referer)两部分进行伪装。

信息来源网址(Referer):

https://www.aiidol.com/v/technology/digital/?spm_id_from=333.334.primary_menu.47#/  是  https://www.aiidol.com/的子网页。则此处的referer=”https://www.aiidol.com/”



注意:data = urllib.request.urlopen(url).read()此处我们所获得的是二进制的字节码,有时候我们在对字节码进行编码的时候(data.decode(“utf-8)),发现会出现乱码的情况。这往往是我们在设置header的时候指定了"Accept-Encoding": "gzip, deflate, br",此时我们只需要将这行代码去掉就可以解决乱码问题。

"Accept-Encoding": "gzip, deflate, br"这个是用来设置从网站中接收的返回数据是否进行gzip压缩。如果设置了,就对数据进行压缩。而浏览器会自动的对数据进行gzip解压。这也就解释了为什么我们通过浏览器查看网页源代码没问题,自己爬取下来,然后打开就会出现乱码。


import urllib.request
#浏览器伪装
def browsersCamouflage():
    headers = {
        "Accept": "image/webp,image/apng,image/*,*/*;q=0.8",
        "Accept-Encoding": "gzip, deflate, br",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Connection": "keep-alive",
        "Referer": "https://www.hao123.com/",
        "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Mobile Safari/537.36"
    }
    #创建opener对象
    opener = urllib.request.build_opener()
    hdeadall = []
    #过循环遍历字典,构造headers信息
    for key, value in headers.items():
        item = (key, value)
        hdeadall.append(item)
    #设置opener对象的头信息
    opener.addheaders = hdeadall
  Return opener


url = "https://www.smpeizi.com"
opener = browsersCamouflage()
#安装opener为全局
urllib.request.install_opener(opener)
data = urllib.request.urlopen(url).read()
print(data)






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2