爬虫--初体验(获取二级网站)

第二部分:爬取爬取二级网站的数据

所谓爬取二级网站的数据,就是把一个网页的子网页中的数据提取出来

例如现在我们有这么一个网站:

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

这样我们就得到了每一部电影的名称以及下载地址啦!

最后友情提示:爬虫是很行,也很邢!不要恶意攻击人家服务器才好。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值