通过脚本遍历全部套餐发现商家隐藏优惠套餐

2018 年 9 月 10 日 · 共 685 字

与其等待推荐,不如主动发现。

本文简单介绍了通过 Python 批量抓取商家套餐信息来发现隐藏套餐的过程。

确定商家

首先要有一个目标网站,才能针对性的进行抓取。不过现在很多商家都是用的 WHMCS,甚至连主题都一样,所以存在一个脚本可以爬多个商家的情况。

本文以 DATABASE BY DESIGN,LCC 为例。

分析套餐的 URL

随便找到一个现有的套餐,比如首页的 Free cPanel! 套餐,它的 URL 为:

https://www.databasebydesignllc.com/newportal/cart.php?a=add&pid=20005

很明显,其中只有 pid 的值是我们需要关注的。在查看了其它套餐之后,可以合理猜测其范围是 20000~20050。为了保险,选择 19950~20100 作为初次遍历的范围,如果发现有范围之外的值,可以再适当扩大范围。

使用requests抓取页面源码

如果你没有安装requests库,通过pip install -U requests来安装。如果连pip都没有,请自行解决或者关闭本页面。

DATABASE BY DESIGN,LCC 似乎对爬虫基本没有防护,直接请求就可以了。

num = 20005
url = "https://www.databasebydesignllc.com/newportal/cart.php?a=add&pid={0}".format(num)
r = requests.get(url).content

变量r就是获得的源码了。

使用BeautifulSoup提取信息

pip install -U bs4 html5lib安装所需的解析库。

首先对源码进行解析。

soup = BeautifulSoup(r, "html5lib")

然后分析源码可知,套餐的名称和配置在一个 class 为product-info的 div 标签里。更具体的来说,是分别在里面的 p 标签里。

将其提取出来即可,去掉换行提高可读性。

p = soup.find("div", class_="product-info").find_all("p")
info = "{0} {1}: {2}".format(num, p[0].get_text(), p[1].get_text().replace("\n", "/"))

大功告成,输出到文件即可。

print(info, file=open("databasebydesignllc.result", "a"))

总结

本文所针对的网站对爬虫的防护不足,所以省略了很多步骤。如果是其他网站,可能需要使用request.Session()来继承 cookie,或者添加 header 甚至使用代理来绕过反爬虫。

本文完整代码如下:

#encoding=utf8

import requests
from bs4 import BeautifulSoup

def get_info(num):
	url = "https://www.databasebydesignllc.com/newportal/cart.php?a=add&pid={0}".format(num)
	r = requests.get(url).content
	soup = BeautifulSoup(r, "html5lib")
	try:
		p = soup.find("div", class_="product-info").find_all("p")
		info = "{0} {1}: {2}".format(num, p[0].get_text(), p[1].get_text().replace("\n", "/"))
		print(info, file=open("databasebydesignllc.result", "a"))
		print(info)
	except:
		print(num)

if __name__ == "__main__":
	for i in range(19950, 20100):
		get_info(i)

99刀3个独服