项目目标

通过爬虫获取“西拉代理”(http://www.xiladaili.com)上的高匿代理,并储存至一个列表。

项目分析

首先对网页进行观察,主体内容如下图所示。
网页主体内容
不但指明了代理IP、协议类型,还有存活时间、打分这些数据。有需要的朋友,可以根据存活时间、打分来有选择性地挑选一些代理,这样获得的代理更加稳定。我仅展示最朴素的方法,即爬取网页上的所有代理。

网页下方有翻页按钮,点击不同页码,可以看到网页url也是非常有规律地在变动。
第四页网址最后就是数字4
一看到这么规整的数据展示,就想到了表格。我们打开浏览器的开发者模式,定位到这一片数据的源代码。可以看到的所有的数据都藏在名为tbody节点中。
在这里插入图片描述
整个项目的思路大致有了,大体有以下三个步骤:
①访问相关页面,读取网页源代码;
②在网页源代码中定位到tbody,从中提取每一行的IP等数据;
③保存至列表中。

在代码实现阶段,我们用selenium模拟浏览器的访问,用BeautifulSoup来解析网页源代码。

    from selenium import webdriver
    import numpy as np
    from bs4 import BeautifulSoup
    
    def getFreeProxy(url):
        # %%打开Chrome浏览器,模拟访问网站
        browser = webdriver.Chrome(executable_path="chromedriver.exe")
        pageNumber = np.random.choice(300) + 1 # 改成自己要爬的页面号,我这里就随机挑选一个页面
        browser.get(url + str(pageNumber))  # 步骤一代码
        # %% 解析代理数据
        soup = BeautifulSoup(browser.page_source, "html.parser")  # 步骤二代码
        proxies = [(r.text.strip().split()[0], r.text.strip().split()[1]) for r in soup.find("tbody").find_all("tr")]  # 步骤三代码
        
        return proxies
	
	if __name__=="__main__":
		url = "http://www.xiladaili.com/gaoni/"
		getFreeProxy(url)

(步骤三代码这么写,是观察到每一行的数据都保存在tbody节点的一个子节点tr中,本项目中我只关心代理IP地址和代理协议类型,只取了前两列的数据)

至此已经完成了我们的基本功能。

改进一:获取的很多代理实际上是不可用的,能不能筛选一下,只保留能用的代理呢?
见https://www.cnblogs.com/nenc/p/4800248.html

改进二:虽然在改进一中,我们显示地指定了浏览器通过代理IP访问网页,我能不能确认一下,实际访问网页的IP就是代理IP而不是本机IP呢?

改进三:当我跑这段代码频繁访问西拉代理的时候,有时候好几秒网页都加载不出来,这是怎么回事?

项目收获

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐