返回列表 发帖

网络爬虫_爬(blog.zhuohua.store)

网络爬虫,可以理解为在网络上爬行的一种蜘蛛。互联网就像一张大网,爬虫在这张网上爬来爬去,遇到需要的资源,可以抓取下来。

在抓取资源的过程中需要使用URL做资源定位。URL(统一资源定位符)就是平常说的网址,可以从互联网上获取资源的位置。

互联网上每个文件都有唯一的URL,URL包含的信息可以指出文件在互联网上的位置。



例子一:
保存通过URL(http://blog.zhuohua.store)获取到的网页源代码和内容:

脚本内容:
#coding=utf-8
import urllib.request #内置模块,无需额外安装

response = urllib.request.urlopen("http://blog.zhuohua.store")

Key_1 = response.read().decode("utf-8")

print(Key_1)


运行脚本,并把输出结果写入(覆盖)到文件:(脚本所在目录下会生成文件1.txt,文件里会包含网页源代码和内容)
C:\Users\jacky\Desktop>python xx.py > 1.txt

C:\Users\jacky\Desktop>





######

例子二:
从例子一获取的数据中筛选出此站点的所有分区名称:

笺注:
站点(http://blog.zhuohua.store)的分区名称格式,如下:
<h3><a href="index.php?gid=3" style="">CentOS6.9/Redhat6.9</a></h3>

<h3><a href="index.php?gid=59" style="">CentOS8/Redhat8</a></h3>

<h3><a href="index.php?gid=11" style="">Windows</a></h3>

<h3><a href="index.php?gid=44" style="">Virtualization</a></h3>

<h3><a href="index.php?gid=33" style="">Python3.6</a></h3>


脚本内容:
#coding=utf-8
from io import StringIO
String_1 = StringIO()

def func1(): #读取文件内容
        Path_1 = "./1.txt"
        f_name = open(Path_1,'r')

        fields_1 = f_name.readlines() #输出结果为列表,包含换行符
        f_name.close()
       
        func2(fields_1)

       
def func2(fields_1): #从func1()获得的数据中进行筛选

        K_1 = "index.php?gid=" #关键字   

        for Key_1 in fields_1:
                if K_1 in Key_1:
                        Result_1 = f"{Key_1.split('style=')[1][3:][:-10]}\n" #以'style='为分隔符进行分割后,取第二项,然后去掉前面3个字符,再去掉最后10个字符,最后换行
                        String_1.write(Result_1)
       
        Result_2 = String_1.getvalue()

        print("此站点的所有分区名称:")
        print(Result_2)

if __name__ == '__main__':

        func1()


脚本运行的结果:(结果最后(右边)会多了一个换行符)
C:\Users\jacky\Desktop>python xx.py
此站点的所有分区名称:
CentOS6.9/Redhat6.9
CentOS8/Redhat8
Windows
Virtualization
Python3.6



C:\Users\jacky\Desktop>





######

例子三:
从例子一获取的数据中筛选出所有分区名称及各自分区下的版块名称:

笺注:
其中分区(Python3.6)下的版块名称格式,如下:
<h2><a href="forumdisplay.php?fid=35"  style="">安装Python3</a></h2>

<h2><a href="forumdisplay.php?fid=34"  style="">基础(一)</a></h2>

<h2><a href="forumdisplay.php?fid=39"  style="">基础(二)</a></h2>

<h2><a href="forumdisplay.php?fid=36"  style="">运维(一)</a></h2>

<h2><a href="forumdisplay.php?fid=38"  style="">运维(二)</a></h2>

<h2><a href="forumdisplay.php?fid=40"  style="">应用</a></h2>


脚本内容:
#coding=utf-8
from io import StringIO
String_1 = StringIO()

def func1(): #读取文件内容
        Path_1 = "./1.txt"
        f_name = open(Path_1,'r')

        fields_1 = f_name.readlines() #输出结果为列表,包含换行符
        f_name.close()
       
        func2(fields_1)

       
def func2(fields_1): #从func1()获得的数据中进行筛选

        K_1 = "index.php?gid=" #分区名称的关键字
        K_2 = "forumdisplay.php?fid=" #版块名称的关键字
  
        for Key_1 in fields_1:
                if K_1 in Key_1:
                        Result_1 = f"《{Key_1.split('style=')[1][3:][:-10]}》\n"
                        String_1.write(Result_1)
               
                if K_2 in Key_1:
                        Result_1 = f"{Key_1.split('style=')[1][3:][:-10]}\n"
                        String_1.write(Result_1)
       
        Result_2 = String_1.getvalue()
        Result_2 = Result_2.rstrip('\n') #去除结果最后(右边)的一个换行符
       
        print("此站点的所有分区名称及各自分区下的版块名称:")
        print(Result_2)

if __name__ == '__main__':

        func1()


脚本运行的结果:
C:\Users\jacky\Desktop>python xx.py
此站点的所有分区名称及各自分区下的版块名称:
《CentOS6.9/Redhat6.9》
安全加固
LNMP一键安装包_v1.3
Lamp
Shell
ftp
Nginx反向代理
Nginx+Tomcat+JDK
Oracle Linux6.9
常见服务
《CentOS8/Redhat8》
基础
基础服务
常用服务
Zabbix4.4.5
《Windows》
安全加固
FTP
文件共享
UPUPW
IIS+PHP
Tomcat
MySQL
MSSQL
DHCP & DNS
Windows域
《Virtualization》
VMware ESXi 6.5
CentOS8_KVM
CentOS7.8_KVM
《Python3.6》
安装Python3
基础(一)
基础(二)
运维(一)
运维(二)
应用

C:\Users\jacky\Desktop>





######

例子四:
获取分区(Python3.6)下的版块《安装Python3》下的主题(文章)名称:

笺注:
版块《安装Python3》下的主题名称格式,如下:
<span id="thread_366"><a href="viewthread.php?tid=366&amp;extra=page%3D1">CentOS7安装Python3</a></span>

<span id="thread_186"><a href="viewthread.php?tid=186&amp;extra=page%3D1">Win10安装Python3</a></span>

<span id="thread_121"><a href="viewthread.php?tid=121&amp;extra=page%3D1">Windows2012R2安装Python3</a></span>

<span id="thread_120"><a href="viewthread.php?tid=120&amp;extra=page%3D1">Win7/Windows2008R2安装Python3</a></span>

<span id="thread_119"><a href="viewthread.php?tid=119&amp;extra=page%3D1">CentOS6安装Python3</a></span>


脚本内容:
#coding=utf-8
import urllib.request
from io import StringIO

def func1(): #获取分区(Python3.6)下的版块《安装Python3》的网页源代码和内容
        String_1 = StringIO()

        url_1 = "http://blog.zhuohua.store/forumdisplay.php?fid=35&page=1" #分区(Python3.6)下的版块《安装Python3》的URL
        response = urllib.request.urlopen(url_1)

        Key_1 = response.read().decode("utf-8")

        String_1.write(Key_1)
        String_2 = String_1.getvalue()
       
        func2(String_2)


def func2(String_2): #把从func1()获得的数据写入(覆盖)文件中
        Path_1 = "./2.txt"
        f_name = open(Path_1,'w') #写入(覆盖)文件内容
        Result_1 = f_name.write(String_2)
        f_name.close()
       
        func3()


def func3(): #从文件中读取数据,再对数据进行筛选
        String_1 = StringIO()
       
        Path_1 = "./2.txt"
        f_name = open(Path_1,'r')

        fields_1 = f_name.readlines() #输出结果为列表,包含换行符
        f_name.close()


        K_1 = 'id="thread_' #关键字   

        for Key_1 in fields_1:
                if K_1 in Key_1:
                        Result_1 = f"{Key_1.split('=page%3D1')[1][2:][:-12]}\n" #以'=page%3D1'为分隔符进行分割后,取第二项,然后去掉前面2个字符,再去掉最后12个字符,最后换行
                        String_1.write(Result_1)
       
        Result_2 = String_1.getvalue()
        Result_2 = Result_2.rstrip('\n') #去除结果最后(右边)的一个换行符

        print("分区(Python3.6)下的版块《安装Python3》下的主题名称:")
        print(Result_2)

if __name__ == '__main__':

        func1()


脚本运行的结果:
C:\Users\jacky\Desktop>python xx.py
分区(Python3.6)下的版块《安装Python3》下的主题名称:
CentOS7安装Python3
Win10安装Python3
Windows2012R2安装Python3
Win7/Windows2008R2安装Python3
CentOS6安装Python3


C:\Users\jacky\Desktop>





######

例子五:
获取文章《CentOS7安装Python3》的名称、内容:

脚本内容:
#coding=utf-8
import urllib.request
from io import StringIO

def func1(): #获取文章《CentOS7安装Python3》的网页源代码和内容
        String_1 = StringIO()

        url_1 = "http://blog.zhuohua.store/viewthread.php?tid=366&extra=page%3D1" #文章《CentOS7安装Python3》的URL
        response = urllib.request.urlopen(url_1)

        Key_1 = response.read().decode("utf-8")

        String_1.write(Key_1)
        String_2 = String_1.getvalue()
       
        func2(String_2)


def func2(String_2): #把从func1()获得的数据写入(覆盖)文件中
        Path_1 = "./2.txt"
        f_name = open(Path_1,'w') #写入(覆盖)文件内容
        Result_1 = f_name.write(String_2)
        f_name.close()
       
        func3()


def func3(): #从文件中读取数据,再对数据进行筛选
        String_1 = StringIO()
       
        Path_1 = "./2.txt"
        f_name = open(Path_1,'r')

        fields_1 = f_name.readlines() #输出结果为列表,包含换行符
        f_name.close()


        K_1 = '<title>' #关键字   

        for Key_1 in fields_1:
                if K_1 in Key_1:
                        Result_1 = f"{Key_1.split('-')[0][7:]}" #以'-'为分隔符进行分割后,取第一项,然后去掉前面7个字符
                        String_1.write(Result_1)
       
        Result_2 = String_1.getvalue()

        print("文章的名称:")
        print(Result_2)

if __name__ == '__main__':

        func1()


脚本运行的结果:(脚本所在目录下会生成文件2.txt,文件里会包含文章的网页源代码和内容)
C:\Users\jacky\Desktop>python xx.py
文章的名称:
CentOS7安装Python3

C:\Users\jacky\Desktop>





######

例子六:
获取文章《CentOS7安装Python3》内容里的图片链接地址:

笺注:
文章内容里的图片链接地址格式,如下:
<img src="images/common/none.gif" file="attachments/day_220328/2203280439849896e93fa2bbcb.png" width="600"

<img src="images/common/none.gif" file="attachments/day_220328/220328044060a1519658779471.png" width="600"


实际的图片链接地址格式,如下:
http://blog.zhuohua.store/attachments/day_220328/2203280439849896e93fa2bbcb.png

http://blog.zhuohua.store/attachments/day_220328/220328044060a1519658779471.png


脚本内容:
#coding=utf-8
import urllib.request
from io import StringIO

def func1(): #获取文章《CentOS7安装Python3》的网页源代码和内容
        String_1 = StringIO()

        url_1 = "http://blog.zhuohua.store/viewthread.php?tid=366&extra=page%3D1" #文章《CentOS7安装Python3》的URL
        response = urllib.request.urlopen(url_1)

        Key_1 = response.read().decode("utf-8")

        String_1.write(Key_1)
        String_2 = String_1.getvalue()
       
        func2(String_2)


def func2(String_2): #把从func1()获得的数据写入(覆盖)文件中
        Path_1 = "./3.txt"
        f_name = open(Path_1,'w') #写入(覆盖)文件内容
        Result_1 = f_name.write(String_2)
        f_name.close()
       
        func3()


def func3(): #从文件中读取数据,再对数据进行筛选
        String_1 = StringIO()
       
        Path_1 = "./3.txt"
        f_name = open(Path_1,'r')

        fields_1 = f_name.readlines() #输出结果为列表,包含换行符
        f_name.close()


        K_1 = 'attachments/day_' #关键字   

        for Key_1 in fields_1:
                if K_1 in Key_1:
                        Result_1 = f"{Key_1.split()[2][6:][:-1]}\n" #以空格为分隔符进行分割后,取第三项,然后去掉前面6个字符,再去掉最后1个字符,最后换行
                        String_1.write(Result_1)
       
        Result_2 = String_1.getvalue()
        Result_2 = Result_2.rstrip('\n') #去除结果最后(右边)的一个换行符

        print("文章内容里的图片链接地址:")
        print(Result_2)

if __name__ == '__main__':

        func1()


脚本运行的结果:(脚本所在目录下会生成文件3.txt,文件里会包含文章的网页源代码和内容)
C:\Users\jacky\Desktop>python xx.py
文章内容里的图片链接地址:
attachments/day_220328/2203280439849896e93fa2bbcb.png
attachments/day_220328/220328044060a1519658779471.png


C:\Users\jacky\Desktop>





######

例子七:
通过链接地址下载图片:

脚本内容:
#coding=utf-8
import urllib.request #内置模块,无需额外安装

URL_1 = 'http://blog.zhuohua.store/attachments/day_220328/2203280439849896e93fa2bbcb.png' #远程文件
URL_2 = URL_1.split('/')[5]

Path_1 = f"d:/share/{URL_2}" #本地文件;必须要有完整的文件名

try:
        urllib.request.urlretrieve(URL_1,Path_1)

except Exception as e:
        print(f"远程文件 {URL_1} 下载失败,原因: {e}")
  
else:
        print(f"远程文件 {URL_1} 下载成功。")


脚本运行的结果:
C:\Users\jacky\Desktop>python xx.py
远程文件 http://blog.zhuohua.store/attachments/day_220328/2203280439849896e93fa2bbcb.png 下载成功。

C:\Users\jacky\Desktop>


会把文件下载到目录D:\share
图片1.png





######

例子八:
下载文章《CentOS7安装Python3》内容里的所有图片:

脚本内容:
#coding=utf-8
import urllib.request
from io import StringIO

def func1(): #获取文章《CentOS7安装Python3》的网页源代码和内容
        String_1 = StringIO()

        url_1 = "http://blog.zhuohua.store/viewthread.php?tid=366&extra=page%3D1" #文章《CentOS7安装Python3》的URL
        response = urllib.request.urlopen(url_1)

        Key_1 = response.read().decode("utf-8")

        String_1.write(Key_1)
        String_2 = String_1.getvalue()
       
        func2(String_2)


def func2(String_2): #把从func1()获得的数据写入(覆盖)文件中
        Path_1 = "./3.txt"
        f_name = open(Path_1,'w') #写入(覆盖)文件内容
        Result_1 = f_name.write(String_2)
        f_name.close()
       
        func3()


def func3(): #从文件中读取数据,再对数据进行筛选
       
        Path_1 = "./3.txt"
        f_name = open(Path_1,'r')

        fields_1 = f_name.readlines() #输出结果为列表,包含换行符
        f_name.close()


        K_1 = 'attachments/day_' #关键字   

        for Key_1 in fields_1:
                if K_1 in Key_1:
                        Result_1 = f"{Key_1.split()[2][6:][:-1]}" #以空格为分隔符进行分割后,取第三项,然后去掉前面6个字符,再去掉最后1个字符
                        Result_2 = 'http://blog.zhuohua.store/' + Result_1

                        func_download(Result_2)
       
       
def func_download(URL_1):
        URL_2 = URL_1.split('/')[5]

        Path_1 = f"d:/share/{URL_2}" #本地文件

        urllib.request.urlretrieve(URL_1,Path_1)
       
        print(f"远程文件 {URL_1} 下载成功。")


if __name__ == '__main__':

        func1()


脚本运行的结果:
C:\Users\jacky\Desktop>python xx.py
远程文件 http://blog.zhuohua.store/attachments/day_220328/2203280439849896e93fa2bbcb.png 下载成功。
远程文件 http://blog.zhuohua.store/attachments/day_220328/220328044060a1519658779471.png 下载成功。

C:\Users\jacky\Desktop>


会把文件下载到目录D:\share
图片2.png
笺注:假如文件名重复,会被直接覆盖。





######

例子九:
获取分区(Python3.6)下的版块《安装Python3》下的排名前三的文章名称:

脚本内容:
#coding=utf-8
import urllib.request
from io import StringIO

def func1(): #获取分区(Python3.6)下的版块《安装Python3》的网页源代码和内容
        String_1 = StringIO()

        url_1 = "http://blog.zhuohua.store/forumdisplay.php?fid=35&page=1" #分区(Python3.6)下的版块《安装Python3》的URL
        response = urllib.request.urlopen(url_1)

        Key_1 = response.read().decode("utf-8")

        String_1.write(Key_1)
        String_2 = String_1.getvalue()
       
        func2(String_2)


def func2(String_2): #把从func1()获得的数据写入(覆盖)文件中
        Path_1 = "./2.txt"
        f_name = open(Path_1,'w') #写入(覆盖)文件内容
        Result_1 = f_name.write(String_2)
        f_name.close()
       
        func3()


def func3(): #从文件中读取数据,再对数据进行筛选
       
        Path_1 = "./2.txt"
        f_name = open(Path_1,'r')

        fields_1 = f_name.readlines() #输出结果为列表,包含换行符
        f_name.close()


        K_1 = 'id="thread_' #关键字  

        list_1 = [] #新建一个空的列表

        for Key_1 in fields_1:
                if K_1 in Key_1:
                        Result_1 = f"{Key_1.split('=page%3D1')[1][2:][:-12]}" #以'=page%3D1'为分隔符进行分割后,取第二项,然后去掉前面2个字符,再去掉最后12个字符
                        list_1.append(Result_1) #往列表里追加元素
               
        print("分区(Python3.6)下的版块《安装Python3》下的文章名称:")
        print(list_1)
       
        print("-" * 10)
       
        print("排名前三的文章名称:")
        print(list_1[0])
        print(list_1[1])
        print(list_1[2])
       
if __name__ == '__main__':

        func1()


脚本运行的结果:
C:\Users\jacky\Desktop>python xx.py
分区(Python3.6)下的版块《安装Python3》下的文章名称:
['CentOS7安装Python3', 'Win10安装Python3', 'Windows2012R2安装Python3', 'Win7/Windows2008R2安装Python3', 'CentOS6安装Python3']
----------
排名前三的文章名称:
CentOS7安装Python3
Win10安装Python3
Windows2012R2安装Python3

C:\Users\jacky\Desktop>





######

例子十:
把分区(Python3.6)下的版块《安装Python3》下的排名前三的文章名称写入数据库:

Access数据库的创建可参考:Python3脚本管理Access

在d:\Database1.mdb里创建表table1,其表结构如下:
图片3.png


脚本内容:
#coding=utf-8
import urllib.request
from io import StringIO

import pyodbc
import datetime
dt = datetime.datetime.now()
tt_1 = dt.strftime('%Y-%m-%d %H:%M:%S') #当前时间

def func1(): #获取分区(Python3.6)下的版块《安装Python3》的网页源代码和内容
        String_1 = StringIO()

        url_1 = "http://blog.zhuohua.store/forumdisplay.php?fid=35&page=1" #分区(Python3.6)下的版块《安装Python3》的URL
        response = urllib.request.urlopen(url_1)

        Key_1 = response.read().decode("utf-8")

        String_1.write(Key_1)
        String_2 = String_1.getvalue()
       
        func2(String_2)


def func2(String_2): #把从func1()获得的数据写入(覆盖)文件中
        Path_1 = "./2.txt"
        f_name = open(Path_1,'w') #写入(覆盖)文件内容
        Result_1 = f_name.write(String_2)
        f_name.close()
       
        func3()


def func3(): #从文件中读取数据,再对数据进行筛选
       
        Path_1 = "./2.txt"
        f_name = open(Path_1,'r')

        fields_1 = f_name.readlines() #输出结果为列表,包含换行符
        f_name.close()


        K_1 = 'id="thread_' #关键字  

        list_1 = []

        for Key_1 in fields_1:
                if K_1 in Key_1:
                        Result_1 = f"{Key_1.split('=page%3D1')[1][2:][:-12]}"
                        list_1.append(Result_1)
       
        print("排名前三的文章名称:")
        print(list_1[0])
        print(list_1[1])
        print(list_1[2])
       
        insert_record(list_1)
       
       
def insert_record(list_1):
       
        DBfile = "d:/Database1.mdb"

        db = pyodbc.connect(r"Driver={Microsoft Access Driver (*.mdb)};DBQ=" + DBfile + ";")
        cursor = db.cursor()
       
        #字段ID为主键、标识符列,会自动增长,不用写
        Key_1 = list_1[0]
        Key_2 = list_1[1]
        Key_3 = list_1[2]
        Key_4 = tt_1
       
        Sql_1 = f"INSERT INTO table1(第一名,第二名,第三名,录入时间) VALUES('{Key_1}','{Key_2}','{Key_3}','{Key_4}')"
        cursor.execute(Sql_1)

        db.commit() #把执行任务提交到数据库
        db.close()
               
if __name__ == '__main__':

        func1()


脚本运行的结果:
C:\Users\jacky\Desktop>python xx.py
排名前三的文章名称:
CentOS7安装Python3
Win10安装Python3
Windows2012R2安装Python3


C:\Users\jacky\Desktop>


数据库的表table1记录到的数据:
图片4.png





######

例子十一:
读取数据库的表table1的数据:

脚本内容:
#coding=utf-8
import pyodbc

def query_data():

        DBfile = "d:/Database1.mdb"

        db = pyodbc.connect(r"Driver={Microsoft Access Driver (*.mdb)};DBQ=" + DBfile + ";")
        cursor = db.cursor()
               
        Sql_1 = "select * from table1"
        cursor.execute(Sql_1)
       
        Result_1 = cursor.fetchall() #使用fetchall可以获取多个元素
        print(Result_1)
        print(type(Result_1))
       
        print("-" * 10)
       
        for Key_1 in Result_1: #自定义输出格式
                ID = Key_1[0]
                one = Key_1[1]
                two = Key_1[2]
                three = Key_1[3]
                four = Key_1[4]

                print(f"第一名=《{one}》,第二名=《{two}》,第三名=《{three}》,录入时间={four}")
               
        db.commit() #把执行任务提交到数据库
        db.close()

def func_main():
        try:
                query_data()
        except Exception as e:
                print(f"输出失败,原因: {e}")

if __name__ == "__main__":

        func_main()


脚本运行的结果:
C:\Users\jacky\Desktop>python xx.py
[(1, 'CentOS7安装Python3', 'Win10安装Python3', 'Windows2012R2安装Python3', datetime.datetime(2019, 9, 9, 9, 7, 8))]
<class 'list'>
----------
第一名=《CentOS7安装Python3》,第二名=《Win10安装Python3》,第三名=《Windows2012R2安装Python3》,录入时间=2019-09-09 09:07:08

C:\Users\jacky\Desktop>





相关文章:
网络爬虫_爬(电影天堂)
网络爬虫_爬(豆瓣电影)
网络爬虫_爬(word.zhuohua.store)

自定义函数
for循环语句
字符串的截取
StringIO()函数
文件操作(创建、读取、写入、追加)

返回列表