前言
如何爬取 HTML?就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS、CSS,如果把网页比作一个人,那么HTML便是他的骨架,JS便是他的肌肉,CSS便是他的衣服。所以最重要的部分是存在于HTML中的,下面我就写个例子来扒一个网页下来
。
初步代码
from urllib.request import Request,urlopen
from urllib.parse import quote
#设置请求头,使用浏览器代理
def get_html(url):
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0"
}
request=Request(url,headers=headers)
response=urlopen(request)
return response.read().decode()
#将爬取的的数据 用html保存
def save_html(html,filename):
with open(filename,'w',encoding='utf-8') as f:
f.write(html)
def main():
t=input("输入贴吧名字:")
n=int(input("输入爬取的页数:"))
name=quote(t)
print(name)
for x in range(n):
url='http://tieba.baidu.com/f?kw='+quote(t)+'&ie=utf-8&pn={}'.format(x*50)
# print(url)
html=get_html(url)
filename=t+'贴吧第'+str(x+1)+'页 html'
save_html(html,filename)
if __name__=="__main__":
main()
代码升级版(实现了随机浏览器UA,用代理服务器,避免源IP地址被封)
设置代理Proxy
假如一个网站它会检测某一段时间某个IP的访问次数,如果访问次数过多,它就会禁止你的访问,因此设置一些代理服务器来帮助你做工作,每隔一段时间 换一个代理,可以有效避免网站 的检测。
代理分类:
透明代理:目标网站知道你用了代理,还知道你源IP地址。无卵用
匿名代理:目标网站知道你用了代理,但不知道你的IP地址。一般
高匿代理:目标网站不知道你用代理,不知道你IP地址。很棒
from urllib.request import Request,build_opener,ProxyHandler
from urllib.parse import quote
from fake_useragent import UserAgent
import time
#设置请求头,使用随机浏览器代理,避免被服务器直接识别为电脑程序。
def get_html(url):
headers = {
"User-Agent": UserAgent().ie
}
request = Request(url, headers=headers)
#采取代理服务器有效避免源IP地址被封
handler = ProxyHandler({"http": "39.137.77.66:8080"})
opener = build_opener(handler)
response = opener.open(request)
return (response.read().decode())
# 将爬取的的数据 用html保存
def save_html(html, filename):
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
def main():
t = input("输入贴吧名字:")
n = int(input("输入爬取的页数:"))
name = quote(t)
print(name)
for x in range(n):
url = 'http://tieba.baidu.com/f?kw=' + quote(t) + '&ie=utf-8&pn={}'.format(x * 50)
print(url)
html = get_html(url)
filename = t + '贴吧第' + str(x + 1) + '页 html'
save_html(html, filename)
#每次爬取停一秒,避免访问频率过高
time.sleep(1)
if __name__ == "__main__":
main()
效果图展示
PS:欢迎补充和指正