如果你想批量的获取整个网站的资源,逐个打开网页进行下载,那样子耗时又耗力,因此python爬虫可以代替人去自动完成下载任务。话不多说,直接见代码:
一、导入模板
import re
from bs4 import BeautifulSoup
import requests
二、设置请求头
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.68 Safari/538.36'}
response=requests.get(url,params=headers)
if response.status_code==200:
print("状态码成功")
if "验证" in response.text:
print("被验证")
return None
else:
return response.text
else:
print("状态码失败"+str(response.status_code))
三、解析HTML文件
def parse_html(html,name):
soup=BeautifulSoup(html,'lxml')
results=soup.select(name)
with open('黄图地址.txt','w') as f:
for result in results:
print(result['src'])
f.write(result['src']+'\n')
四、运行
url='https://www.16df.xyz/pic/5/2020-01-10/25477.html'
html=get_html(url)
if html==None:
print('none')
pass
else:
parse_html(html,name='img')
运行之后我们可以得到一个黄图地址.txt的文件
import re
from bs4 import BeautifulSoup
import requests
def get_html(url):
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.68 Safari/538.36'}
response=requests.get(url,params=headers)
if response.status_code==200:
print("状态码成功")
if "验证" in response.text:
print("被验证")
return None
else:
return response.text
else:
print("状态码失败"+str(response.status_code))
def parse_html(html,name):
soup=BeautifulSoup(html,'lxml')
results=soup.select(name)
with open('黄图地址.txt','w') as f:
for result in results:
print(result['src'])
f.write(result['src']+'\n')
url='https://www.16df.xyz/pic/5/2020-01-10/25477.html'
html=get_html(url)
if html==None:
print('none')
pass
else:
parse_html(html,name='img')
六、复盘(详细解读)
①请求头:
如果你直接在Python的编辑器中用get方法获取目标html文件,则服务器端会准确识别你为爬虫,很多网站有反爬措施,则会将你拒之门外,那么正确使用请求头则会在一定程度上避免这种不友好行为。但是目前很多服务器会识别你的请求头,也会将你拒之门外。我们可以使用代理来解决这种问题,对于绝大多数小型网站来说,只需要一个简单的请求头,则可以获取目标html文件。下图就是一个非常简单的请求头。
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.68 Safari/538.36'}
response=requests.get(url,params=headers)
如果不知道请求头在哪里找,我们可以打开某一个网站,如下图,红圈内的代码即为请求头:
②获取html文件
首先,我们使用requests.get(url,params=headers)方法来获取目标html的信息。值得一提的是状态码。如果我们能正常访问网站的话,那么状态码即为200,如常见的404、405等即为不正确访问。
如果状态码为200时,我们就会获取目标html文件。
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.68 Safari/538.36'}
response=requests.get(url,params=headers)
if response.status_code==200:
print("状态码成功")
if "验证" in response.text:
print("被验证")
return None
else:
return response.text
else:
print("状态码失败"+str(response.status_code))
一般很多网站都会有反爬机制,在短时间内多次访问很有可能会被拒之门外,你获取的html文档则会是一堆无用的代码。所以可以使用上述代码来确定我们得到的代码是否被验证,是否为目标代码。值得注意的是,访问方式methods如果服务器指定只可以POST访问,则我们会获得405状态码,所以在这之前,我们需要知道网站的访问方式,根据methods来确定访问方式。
③解析html
pyhton的第三方库是非常强大的,如urllib、requests、re正则表达式用来获得html,如Beautiful Soup、XPath、pyquery等用来解析html。
def parse_html(html,name):
soup=BeautifulSoup(html,'lxml')
results=soup.select(name)
with open('黄图地址.txt','w') as f:
for result in results:
print(result['src'])
f.write(result['src']+'\n')
将BeautifulSoup(html,‘lxml’)实例化,然后使用soup.select()筛选器来获得我们想要的东西。熟练掌握html/css/javascript的,可以非常熟练的使用pyquery来筛选。一般常用的的格式如下:
Beautiful:
find_all(name,attrs,recursive,text,**kwargs)
XPath:
html.xpath(’//x/x’)
pyquery:
doc=pq(url)
doc(‘goal’)
re:
re.findall(‘goal’,html,…)
④保存目标资源
我们已经解析了html代码,那么就可以获得想要得到的资源,如图片,视频,链接等。如果资源太多的话,我们可以将获得的资源保存到数据库中。
此实例中,我们获取的是一大堆链接,打开链接,我么就可以看到图片。如果想要直接获取照片的话,我们可以利用以下代码来完成:
with open('黄图地址.txt','r')as f:
readlines=f.readlines()
lens=len(readlines)
print(lens)
for i in range(lens):
url=readlines[i].rstrip()
print(url)
filename=str(i+1)+'.jpg'
with open(filename,'wb')as f1:
print("正在下载{}".format(i+1))
f1.write(requests.get(url).content)
print("下载完成")
接下来你就可以在所在文件的目录里看到照片一张接着一张被下载下来,再次就不再展示美图了。
完整代码:
import re
from bs4 import BeautifulSoup
import requests
def get_html(url):
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.68 Safari/538.36'}
response=requests.get(url,params=headers)
if response.status_code==200:
print("状态码成功")
if "验证" in response.text:
print("被验证")
return None
else:
return response.text
else:
print("状态码失败"+str(response.status_code))
def parse_html(html,name):
soup=BeautifulSoup(html,'lxml')
results=soup.select(name)
with open('黄图地址.txt','w') as f:
for result in results:
print(result['src'])
f.write(result['src']+'\n')
url='https://www.16df.xyz/pic/5/2020-01-10/25477.html'
html=get_html(url)
if html==None:
print('none')
pass
else:
parse_html(html,name='img')
with open('黄图地址.txt','r')as f:
readlines=f.readlines()
lens=len(readlines)
print(lens)
for i in range(lens):
url=readlines[i].rstrip()
print(url)
filename=str(i+1)+'.jpg'
with open(filename,'wb')as f1:
print("正在下载{}".format(i+1))
f1.write(requests.get(url).content)
print("下载完成")
**Thanks**