批量检测链接是否有效

因为公司会在很多平台发布传播消息,最后需要将各个网站传播的网址收集起来,去找其它公司报账。每个月大概会有1000多条的网址需要检测是否有效,于是写了个测试链接是否有效。
首先考虑的是用状态码,访问成功返回200,地址错误回返回404等其它错误码

                response = requests.get(url, headers=headers)
                if str(response.status_code) == "200":

结果发现,现在很多网站即使是404也会返回200的状态码,因为网站后台回将404跳转到写好的错误页面,下面以微博为例,其中微博我统计的有两种地址。
一种地址是不带m的地址,如 https://weibo.com/6391771136/KmzPKg193
一种地址是带m.的地址,如https://m.weibo.cn/status/4653812294355107?
一种是网址中含有tv/show/的地址,这种比较少

如果链接中是带m.的,直接使用地址发送请求,然后查询请求中的标题,用于判断链接是否有效,如果用户设置了权限也是无法看见的,所有我设置了3种检测结果,代码如下

                response = requests.get(i['link'], headers=headers)
                page_info = response.text
                title = re.findall(r'<title>(.+?)</title>', page_info)
                if '出错了' in title:
                    i['status'] = '链接出错'
                elif '微博' in title:
                    i['status'] = '有效'
                else:
                    i['status'] = '无法识别'

链接有效的标题为。[‘微博’]
链接粗五的标题为:[‘微博-出错了’]

第二种就是链接中不带m.的,这种链接是ajax请求,直接使用地址是没办法获取数据的,所有需要构建js请求,使用geogle的抓包工具即可获取js请求地址。获取js地址如下所示,有更快的办法也可以交流
1,打开网址,按住f12 或者点击鼠标右键,然后点击检查。选中Network,选中XHR,然后刷新一下网页就可以抓取网络包和请求,然后随便在搜索框查询页面中的文字,搜索框下面会有结果,点击结果,再点击Headers就可以看见js请求了,找一下规律了发现请求变成了https://weibo.com/ajax/statuses/show?id= + 原来地址的最后一串字符串
查询地址 https://weibo.com/6391771136/KmzPKg193
新地址 https://weibo.com/ajax/statuses/show?id=KmzPKg193
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
获取了新的请求地址就可以发起请求判断是否有效了,js请求我使用的判断是根据返回的状态码,因为微博的js请求错误会返回400的错误,当然你也可以根据js中的数据来进行判断

                url = str(i['link']).rsplit('/')[-1]
                url = 'https://weibo.com/ajax/statuses/show?id=' + url
                response = requests.get(url, headers=headers)
                if str(response.status_code) == "200":
                    i['status'] = '有效'
                else:
                    i['status'] = '链接出错'

网址中含有tv/show/的和上面的的js请求操作一样,构建的链接有点不一样,直接上代码

            elif 'tv/show/' in i['link']:
                url_item = str(i['link']).split(':')[-1]
                url_item = url_item.split("?")[0]
                url = 'https://weibo.com/ajax/statuses/buildComments?is_reload=1&id={}&is_show_bulletin=2&is_mix=0&max_id=0&count=20&uid=1864419143'.format(url_item)
                response = requests.get(url, headers=headers)
                if str(response.status_code) == "200":
                    i['status'] = '有效'
                else:
                    i['status'] = '链接出错'

各位有什么对网址检查的好办法希望多多交流
测试的时候会报ssl证书的错误加上以下代码就好了
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值