第二部分:爬取爬取二级网站的数据
所谓爬取二级网站的数据,就是把一个网页的子网页中的数据提取出来
例如现在我们有这么一个网站:
https://www.dytt89.com/
我们的目标为提取经典大片里面电影的名字及其下载地址。
想要得到子网页的数据,我们的步骤分为三步:
1.定位到主网页
2.从主网页中提取到子网页的链接地址
3.请求子网页的链接地址,get到我们想要的数据
在跑程序的时候,我们最好是在get方法里面设置verify参数。因为requests设置移除SSL认证的时候,控制台会抛出警告,我们让verify=False,可以去掉安全验证
resp = requests.get(domain, verify=False)
由主网页的源代码我们可以得到网页的编码方式:gb2312
因此我们需要手动指定字符集:
resp.encoding = 'gb2312'
(如果发现text打出来是乱码,可以先看看这个网站的编码方式是什么)
下面开始解析数据:
由图所示,我们想要的数据存放在了经典大片下方的<ul>和</ul>当中
此时我们通过re模块里的两个函数提取<ul>和</ul>中的内容:
obj1 = re.compile(r'经典大片.*?<ul>(?P<ul>.*?)</ul>', re.S) # re.S : 让.能匹配换行符
result1 = obj1.finditer(resp.text)
ul装载着<ul>和</ul>之间那一大串html代码,里面包含着我们想要的电影名的子网页。接下来我们用相同的方法提取这些子网页,为后面我们进入各电影的子网页提取下载地址做准备。
以电影《无间道》为例,我们想要的子网页保存在<a href....>里面。通过实践可知,主网站的网址加上<a href >里面的地址就是我们想要的子网页的网址。如下我们对这些地址进行提取:
obj2 = re.compile(r"<a href='(?P<href>.*?)'", re.S)
result2 = obj2.finditer(ul)
result2里面包含每一个子网页的一部分,我们通过字符串相加的方法对子网页进行不全并且保留子网页于一个列表当中:
child_href_list = []
child_href = domain + j.group('href').strip('/')
child_href_list.append(child_href)
得到了每一个子网页之后,我们就可以通过和提取<ul></ul>中内容相同的方法来提取电影名称和下载地址:
for href in child_href_list:
a = requests.get(href, verify=False)
a.encoding = 'gb2312'
# print(a.text) # 拿到了每一个子网站的源代码
# break
result3 = obj3.finditer(a.text)
for i in result3:
print(i.group('name'), ' ', i.group('download'))
result3 = obj3.search(a.text)
总代码如下所示:
import warnings
import requests # 访问
import re # 开爬
warnings.filterwarnings('ignore')
# , verify=False
domain = 'https://www.dytt89.com/'
resp = requests.get(domain, verify=False) # verify=False 去掉安全验证
resp.encoding = 'gb2312' # 指定字符集 如果发现text打出来是乱码,可以先看看这个网页的编码方式是什么
print(resp.text)
# 拿到ul里面的li
# obj1 = re.compile(r'2022必看热片.*?<ul>(?P<ul>.*?)</ul>', re.S) # re.S : 让.能匹配换行符
obj1 = re.compile(r'经典大片.*?<ul>(?P<ul>.*?)</ul>', re.S)
obj2 = re.compile(r"<a href='(?P<href>.*?)'", re.S)
obj3 = re.compile(r'◎片 名(?P<name>.*?)<br />.*?设置办法<a href="(?P<download>.*?)">.*?</a></p>', re.S)
result1 = obj1.finditer(resp.text)
child_href_list = []
for i in result1:
ul = i.group('ul')
result2 = obj2.finditer(ul)
# 提取子页面链接:
for j in result2:
# print(j.group('href')) # j.group('href')是子网站的一部分
# 拼接每一个子页面的url地址 :域名 + 子页面地址
child_href = domain + j.group('href').strip('/') # 这个/是多出来的
child_href_list.append(child_href) # 把子页面保存起来
# 提取子页面内容
for href in child_href_list:
a = requests.get(href, verify=False)
a.encoding = 'gb2312'
# print(a.text) # 拿到了每一个子网站的源代码
# break
result3 = obj3.finditer(a.text)
for i in result3:
print(i.group('name'), ' ', i.group('download'))
result3 = obj3.search(a.text)
# print(result3.group('name'))
�o�g道 https://www.dy2018.com/i/20070319/12.html
The Pianist https://www.dy2018.com/i/20070319/12.html
LOL (Laughing Out Loud) https://www.dy2018.com/i/20070319/12.html
The Lord of the Rings: The Return of the King https://www.dy2018.com/i/20070319/12.html
The Lord of the Rings: The Two Towers https://www.dy2018.com/i/20070319/12.html
The Lord of the Rings: The Fellowship of the Ring https://www.dy2018.com/i/20070319/12.html
Der Untergang https://www.dy2018.com/i/20070319/12.html
Flipped https://www.dy2018.com/i/20070319/12.html
茶馆 https://www.dy2018.com/i/20070319/12.html
大闹天宫 https://www.dy2018.com/i/20070319/12.html
The Dark Knight Rises https://www.dy2018.com/i/20070319/12.html
The Dark Knight https://www.dy2018.com/i/20070319/12.html
Batman Begins https://www.dy2018.com/i/20070319/12.html
何以为家 https://www.dy2018.com/i/20070319/12.html
The Pursuit of Happyness https://www.dy2018.com/i/20070319/12.html
这样我们就得到了每一部电影的名称以及下载地址啦!
最后友情提示:爬虫是很行,也很邢!不要恶意攻击人家服务器才好。