python爬取资源网站资源

如果你想批量的获取整个网站的资源,逐个打开网页进行下载,那样子耗时又耗力,因此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**
  • 26
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穆穆Max

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值