抓取网页中的十个IP http://datamining.comratings.com/exam

解题思路

1.把网页里面的js反混淆,查看源码,里面有session生成算法
2.用python重写session生成算法
3.利用session把网页里面的数据抓取下来
4.利用xpath,正则等把真正的IP筛选出来

在<style></style>里面定义的有四个属性,去除含有这四个属性的标签和‘display:none’的标签,把真正的IP筛选出来

解题代码:



import re

import lxml.html
import requests
from fake_useragent import UserAgent

encoderchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="

#用python重写生成session的算法
def f1(a):
    i, len_str = 0,0
    c, c2, c3 = 0,0,0
    len_str = len(a)
    i = 0
    b = ""
    while i < len_str:
        c = ord(a[i]) & 0xff
        i += 1
        if i == len_str:
            b += encoderchars[c >> 2]
            b += encoderchars[(c & 0x3) << 4]
            b += "=="
            break
        c2 = ord(a[i])
        i += 1
        if i == len_str:
            b += encoderchars[c >> 2]
            b += encoderchars[(((c & 0x3) << 4) | ((c2 & 0xf0) >> 4))]
            b += encoderchars[((c2 & 0xf) << 2)]
            b += "="
            break
        c3 = ord(a[i])
        b += encoderchars[c >> 2]
        b += encoderchars[(((c & 0x3) << 4) | ((c2 & 0xf0) >> 4))]
        b += encoderchars[(((c2 & 0xf) << 2) | ((c3 & 0xc0) >> 6))]
        b += encoderchars[c3 & 0x3f]
        i += 1

    return b

s = requests.session()
result = s.get('http://datamining.comratings.com/exam')
session_id = result.cookies.get_dict()['session']
#调用算法生成session
r_cookies = 'session={};c1={}; c2={}; path=/'.format(session_id,f1(session_id[1:4]),f1(session_id))

headers = {
    "User-Agent":UserAgent().random,
    "Cookie":r_cookies
}

ss = s.get('http://datamining.comratings.com/exam3',headers=headers).text


pattern = re.compile(r'<body>(.*?)<body>',re.DOTALL)
#用正则切出body内容
result = pattern.findall(ss)
result1 = result[0].split('<br>')   #根据<br>切出来的十一个片段

sty = re.compile(r'<style>(.*?)</style>',re.DOTALL)
sty1 = sty.findall(ss)  #style里面的内容
sty2 = re.compile(r'.(.*?){')
sty22 = sty2.findall(sty1[0])  # style里面定义的四个属性组成的集合

data = []  #空数组,存放十个IP
data.append(result1[0])

for data_res in result1[1:]:  #遍历按照换行切开的十段字符串
    line_array = data_res.split('\n')  #每一行组成的数组
    ip_data = []  # 组成IP的四个数字存放的数组
    ip_str = ''
    for line_str in line_array:   #遍历每一行
        ip_regex = re.compile(r'\d+')
        if sty22[0] not in line_str and sty22[1] not in line_str  and 'none' not in line_str:
            #利用正则切出符合条件的数字
            ip_array = ip_regex.findall(line_str)

            if ip_array != []:
                ip_data.append(ip_array[0])

    #把筛选出来的的四个数字组合成IP
    ip_str = ip_data[0] + '.' + ip_data[1] + '.' + ip_data[2] + '.' + ip_data[3]

    #把每一个IP存到数组里
    data.append(ip_str)

for i in data:
    print(i)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的Python爬虫代码,可以抓取上海交通大学、清华大学和北京大学在上海排名和全球排名的信息: ```python import requests from bs4 import BeautifulSoup url = 'https://www.shanghairanking.cn/institution/shanghai-tech-university' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 获取上海科技大学在上海排名和全球排名 shanghai_rank = soup.select_one('.rank').text global_rank = soup.select_one('.rank-world').text print('上海科技大学在上海排名:', shanghai_rank) print('上海科技大学全球排名:', global_rank) url = 'https://www.shanghairanking.cn/institution/tsinghua-university' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 获取清华大学在上海排名和全球排名 shanghai_rank = soup.select_one('.rank').text global_rank = soup.select_one('.rank-world').text print('清华大学在上海排名:', shanghai_rank) print('清华大学全球排名:', global_rank) url = 'https://www.shanghairanking.cn/institution/peking-university' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 获取北京大学在上海排名和全球排名 shanghai_rank = soup.select_one('.rank').text global_rank = soup.select_one('.rank-world').text print('北京大学在上海排名:', shanghai_rank) print('北京大学全球排名:', global_rank) ``` 这个代码使用了requests库和BeautifulSoup库来获取网页内容和解析HTML文档。其,我们通过调用soup.select_one()方法来选择相应的HTML元素,并获取其文本内容。运行代码后,输出结果应该是类似于: ``` 上海科技大学在上海排名: 11 上海科技大学全球排名: 301-400 清华大学在上海排名: 3 清华大学全球排名: 23 北京大学在上海排名: 4 北京大学全球排名: 24 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值