黑马程序员技术交流社区
标题:
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