与其等待推荐,不如主动发现。
本文简单介绍了通过 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)