1.1读取一个网页的源代码:
url:我们要爬取的网页链接(例如:url = “https://www.hao123.com”)
#读取一个网页的源代码
import urllib.request def read_pageHtml(url): file = urllib.request.urlopen(url) data = file.read() return data url = "https://www.hao123.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.hao123.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.bilibili.com/v/technology/digital/?spm_id_from=333.334.primary_menu.47#/ 是 https://www.bilibili.com/的子网页。则此处的referer=”https://www.bilibili.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.hao123.com" opener = browsersCamouflage() #安装opener为全局 urllib.request.install_opener(opener) data = urllib.request.urlopen(url).read() print(data)
3正则表达式