网络爬虫_爬(豆瓣电影)

例子一:

保存通过URL(https://movie.douban.com)获取到的网页源代码和内容:

 

笺注:

当前很多网站都有反爬虫机制,对于爬虫请求会一律拒绝。

网站的程序是怎样区分一个请求是正常请求还是爬虫程序发出的请求呢?

网站的程序其实是通过判断发送请求中是否有浏览器信息,从而区分一个请求是正常请求还是爬虫程序发出的请求。

当访问有反爬虫机制的网站时,可以在请求中设置浏览器信息(伪装成浏览器),这是通过修改http包中的headers实现。

 

 

脚本内容:

#coding=utf-8

import urllib.request #内置模块,无需额外安装

 

headers = {

‘User-Agent’:’Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201Firefox/3.5.6′

}

 

url_1 = ‘https://movie.douban.com’ #网站 (豆瓣电影)的URL

 

ret = urllib.request.Request(url_1,headers = headers)

response = urllib.request.urlopen(ret)

 

Key_1 = response.read().decode(“utf-8”)

 

Path_1 = “./1.txt”

 

f_name = open(Path_1,’w’,encoding=’utf-8′) #写入(覆盖)文件内容

Result_1 = f_name.write(Key_1)

 

f_name.close()

 

 

运行脚本的结果:(脚本所在目录下会生成文件1.txt,文件里会包含网页源代码和内容)

C:\Users\jacky\Desktop>python xx.py

 

C:\Users\jacky\Desktop>

 

 

 

 

######

 

例子二:

从例子一获取的数据中筛选出版块[正在热映]下的所有电影名称:

笺注:
版块[正在热映]的电影名称格式,如下:

<li class=”ui-slide-item”  data-title=”边缘行者” data-release=”2022″ data-rate=”5.3″ data-star=”30″ data-trailer=”https://movie.douban.com/subject/35192672/trailer” data-ticket=”https://movie.douban.com/ticket/redirect/?movie_id=35192672″ data-duration=”113分钟” data-region=”中国大陆” data-director=”黄明升” data-actors=”任贤齐 / 任达华 / 方中信” data-intro=”” data-enough=”true” data-rater=”12771″>

 

<li class=”ui-slide-item”  data-title=”少年英雄董存瑞” data-release=”2022″ data-rate=”” data-star=”00″ data-trailer=”https://movie.douban.com/subject/35917114/trailer” data-ticket=”https://movie.douban.com/ticket/redirect/?movie_id=35917114″ data-duration=”82分钟” data-region=”中国大陆” data-director=”张利鹏” data-actors=”林子杰 / 高宇阳 / 赵中华” data-intro=”” data-enough=”false” data-rater=”4″>

 

<li class=”ui-slide-item”  data-title=”小妈妈 Petite maman” data-release=”2021″ data-rate=”7.9″ data-star=”40″ data-trailer=”https://movie.douban.com/subject/35225859/trailer” data-ticket=”https://movie.douban.com/ticket/redirect/?movie_id=35225859″ data-duration=”72分钟” data-region=”法国” data-director=”瑟琳·席安玛” data-actors=”约瑟芬·桑兹 / 加布里埃尔·桑兹 / 尼娜·梅尔瑞斯” data-intro=”” data-enough=”true” data-rater=”11007″>

 

 

脚本内容:

#coding=utf-8

import re #导入正则表达式的模块;内置模块,无需额外安装

 

from io import StringIO

String_1 = StringIO()

 

def func1(): #读取文件内容

Path_1 = “./1.txt”

f_name = open(Path_1,’r’,encoding=’utf-8′)

 

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

f_name.close()

func2(fields_1)

 

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

 

print(‘版块[正在热映]下的所有电影名称:’)

K_1 = ‘data-title=’ #关键字

 

for Key_1 in fields_1:

if K_1 in Key_1:

Result_1 = re.compile(u'<li.*?data-title=”(.*?)”.*?’)

Result_2 = Result_1.findall(Key_1)

print(Result_2[0])

Result_3 = f”{Result_2[0]}\n”

String_1.write(Result_3)

Result_4 = String_1.getvalue()

func3(Result_4)

def func3(Result_4): #把电影名称保存到文件

 

Path_1 = “./2.txt”

 

f_name = open(Path_1,’w’,encoding=’utf-8′) #写入(覆盖)文件内容

Result_1 = f_name.write(Result_4)

 

f_name.close()

 

if __name__ == ‘__main__’:

 

func1()

 

 

脚本运行的结果:

C:\Users\jacky\Desktop>python xx.py

版块[正在热映]下的所有电影名称:

哆啦A梦:大雄的宇宙小战争2021 ドラえもん のび太の宇宙小戦争リトル・スター・ウォーズ2021

刿心剑

边缘行者

超级特战队

盒子的秘密

亡命救护车 Ambulance

少年英雄董存瑞

小妈妈 Petite maman

加加林 Gagarine

 

C:\Users\jacky\Desktop>

 

 

脚本所在目录下会生成文件2.txt,文件里会包含版块[正在热映]下的所有电影名称:

图片11

网络爬虫_爬(电影天堂)

例子一:

保存通过URL(https://m.dytt8.net/index2.htm)获取到的网页源代码和内容:

 

连接公网安装第三方库(requests):

C:\Users\jacky\Desktop>pip3 install requests -i http://mirrors.aliyun.com/pypi/simple –trusted-host=mirrors.aliyun.com

 

 

脚本内容:

#coding=utf-8

import requests

 

url = ‘https://m.dytt8.net/index2.htm’ #网站 (电影天堂)的URL

 

response = requests.get(url=url)

response.encoding = ‘gbk’ #有些网站使用gbk,有些网站使用utf-8

Key_1 = response.text

#print(Key_1)

 

Path_1 = “./1.txt”

 

f_name = open(Path_1,’w’,encoding=’utf-8′) #写入(覆盖)文件内容

Result_1 = f_name.write(Key_1)

 

f_name.close()

 

 

运行脚本的结果:(脚本所在目录下会生成文件1.txt,文件里会包含网页源代码和内容)

C:\Users\jacky\Desktop>python xx.py

 

C:\Users\jacky\Desktop>

 

 

 

 

 

 

 

 

 

 

 

 

 

######

 

例子二:

从例子一获取的数据中筛选出版块[最新电影下载]下的所有电影名称:

 

笺注:

版块[最新电影下载]下的电影名称格式,如下:

  • [<a href=”/html/gndy/dyzz/index.html”>最新电影下载</a>]<a href=’/html/gndy/dyzz/20220527/62647.html’>2022年剧情《以青春之名》HD国语中字</a><br/>

 

  • [<a href=”/html/gndy/dyzz/index.html”>最新电影下载</a>]<a href=’/html/gndy/dyzz/20220527/62645.html’>2022年爱情喜剧《替身演员》BD中英双字</a><br/>

 

  • [<a href=”/html/gndy/dyzz/index.html”>最新电影下载</a>]<a href=’/html/gndy/dyzz/20220527/62646.html’>2021年悬疑惊悚《黑匣子/黑盒线索》BD中字</a><br/>

 

 

脚本内容:

#coding=utf-8

from io import StringIO

String_1 = StringIO()

 

def func1(): #读取文件内容

Path_1 = “./1.txt”

f_name = open(Path_1,’r’,encoding=’utf-8′)

 

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

f_name.close()

func2(fields_1)

 

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

 

K_1 = “最新电影下载</a>” #关键字

for Key_1 in fields_1:

if K_1 in Key_1:

Result_1 = f”{Key_1.split(‘html’)[4][2:][:-10]}\n” #以’html’为分隔符进行分割后,取第五项,然后去掉前面2个字符,再去掉最后10个字符,最后换行

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

版块[最新电影下载]下的所有电影名称:

2021年剧情灾难《峰爆/无限救援》BD国语中字

2022年剧情《以青春之名》HD国语中字

2022年爱情喜剧《替身演员》BD中英双字

2021年悬疑惊悚《黑匣子/黑盒线索》BD中字

2022年动作《记忆/失忆刺客/记忆杀神》BD中英双字

2022年科幻动作喜剧《刺猬索尼克2》HD中英双字

2022年纪录片《网络炼狱:揭发N号房》BD韩语中字

2022年动画喜剧《奇奇与蒂蒂:救援突击队》BD中英双字

2022年科幻惊悚《双重躯体》BD中英双字

2021年剧情传记《幸存者》BD中英双字

2022年喜剧奇幻《瞬息全宇宙》BD中英双字

2022年喜剧《重返毕业季》BD中英双字

2022年动作《青面修罗》HD国语中英双字

2022年动作科幻《暗夜博士:莫比亚斯》BD中英双字

2022年动作冒险《北欧人》BD中英双字

 

C:\Users\jacky\Desktop>

 

 

 

 

 

 

 

 

 

 

 

 

######

 

例子三:

从例子一获取的数据中筛选出版块[最新电影下载]下的所有电影名称:

 

脚本内容:(使用正则表达式)

#coding=utf-8

import re #导入正则表达式的模块(内置模块,不用额外安装)

 

def func1(): #读取文件内容

Path_1 = “./1.txt”

f_name = open(Path_1,’r’,encoding=’utf-8′)

 

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

f_name.close()

func2(fields_1)

 

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

 

print(“版块[最新电影下载]下的所有电影名称:”)

K_1 = “最新电影下载</a>” #关键字

 

for Key_1 in fields_1:

if K_1 in Key_1:

Result_1 = re.compile(u”.*?html’>(.*?)</a><br/>.*?”)

Result_2 = Result_1.findall(Key_1)

print(Result_2[0])

 

if __name__ == ‘__main__’:

 

func1()

 

 

脚本运行的结果:

C:\Users\jacky\Desktop>python xx.py

版块[最新电影下载]下的所有电影名称:

2021年剧情灾难《峰爆/无限救援》BD国语中字

2022年剧情《以青春之名》HD国语中字

2022年爱情喜剧《替身演员》BD中英双字

2021年悬疑惊悚《黑匣子/黑盒线索》BD中字

2022年动作《记忆/失忆刺客/记忆杀神》BD中英双字

2022年科幻动作喜剧《刺猬索尼克2》HD中英双字

2022年纪录片《网络炼狱:揭发N号房》BD韩语中字

2022年动画喜剧《奇奇与蒂蒂:救援突击队》BD中英双字

2022年科幻惊悚《双重躯体》BD中英双字

2021年剧情传记《幸存者》BD中英双字

2022年喜剧奇幻《瞬息全宇宙》BD中英双字

2022年喜剧《重返毕业季》BD中英双字

2022年动作《青面修罗》HD国语中英双字

2022年动作科幻《暗夜博士:莫比亚斯》BD中英双字

2022年动作冒险《北欧人》BD中英双字

 

C:\Users\jacky\Desktop>

 

 

 

网络爬虫_爬(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&extra=page%3D1″>CentOS7安装Python3</a></span>

 

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

 

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

 

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

 

<span id=”thread_119″><a href=”viewthread.php?tid=119&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>