西区代码小仓库 - 爬虫
type: channel
link: https://www.lisper517.top/tag/%E7%88%AC%E8%99%AB/
items: Python，爬虫与深度学习（6）——爬虫详解（二）构建自己的ip池（简易版）
items: Python，爬虫与深度学习（2）——爬虫详解（一）爬取金融机构成交持仓排名

Python，爬虫与深度学习（6）——爬虫详解（二）构建自己的ip池（简易版）
type: item
date: 2022-09-04T15:13:00+00:00
description: 步骤/目录： 1.需求分析 2.mysql建表 3.网页请求分析 4.爬虫编写 （0）安装所需模块 （1）mysql存取 （2）爬虫主体编写 （3）其他爬虫补充 （4）实际运行 （5）检测爬取的ip 5.总结与改进本文首发于个人博客https://lisper517.top/index.php/archives/44/，转载请注明出处。本文的目的是构建自己的ip池。本文写作日期为2022年9月4日。操作的平台为win10，编辑器为VS code。爬虫写的好，牢房进的早。使用爬虫时不要占用服务器太多流量，否则可能惹祸上身。除了python与爬虫，这里实际上还需要了解html格式与mysql命令。可以在 runoob-html 或 runoob-mysql 找到初步的学习资料，或者查看笔者其他的文章。最后，笔者的能力有限，也并非CS从业人员，很多地方难免有纰漏或者不符合代码原则的地方，请在评论中指出。1.需求分析之前说过，在对别人的网页服务器进行爬取时要注意不能占用太多服务器资源。但有时候，我们确实需要在短时间内对某个网页高频访问，又担心自己被封ip，那么此时维护一个ip池就非常有必要，我们需要对网络上的ip（每个ip背后是一个或一群服务器）进行测试，看是否能利用这些ip作为代理服务器访问其他网页。本文先介绍如何爬取ip，后续文章会介绍如何用自己的ip池爬取网页，以及代理失效时更换代理。在爬虫的一些较高级的应用中，一个ipool是非常基础且不可或缺的，所以建议学会scrapy后就应该尽快建立自己的ipool（除非没有高频访问某个网页的需求）。ip池的构建和使用分为两步，第一步是筛选ip。世界上的公网ipv4地址最多有 4,294,967,296 个（256^4。实际上有一些被局域网占用，有一些不会使用），要一个个去验证这些ip耗时太长，何况还需要对已存在的ip进行验证、剔除失效ip。所以，这里使用一些提供免费代理ip的网页缩小ip搜索范围，爬取到的代理ip不做验证，都放入库中（这里使用mysql）。第二步是对mysql中已有的ip进行验证，挑选出对某个网址有效的代理ip。这一步严格来讲和第一步关系不大，它可以在前一个步骤进行时也同步进行，更重要的是这一步是在其他爬虫开始后才进行，下面就讲解一下免费代理ip的使用。免费代理可分为HTTP或HTTPS，高匿名和低匿名。如果爬虫运行时经过了这些免费代理，毕竟还是别人的服务器，你的请求和响应是到了别人那里，所以用代理服务器时不要传递一些私密信息。实在有必要的话，自己买服务器做转发。最后，同一个代理ip，可能你用它代理一个网站可以，代理另一个网站就不行，这也是不确定因素，所以爬到的代理ip在使用时还要对特定的网址进行测试，其实也是比较麻烦的，如果有紧急需求，建议买一些付费的代理ip。2.mysql建表在mysql中存储收集到的ip，需要新建以下列：ip，字符串形式，VARCHAR(50)（为了将来兼容ipv6，稍微长一点）；端口号，数值形式，SMALLINT UNSIGNED（刚好是0~65535）；匿名度，2个bit位，BIT(2)（0表示低匿名，1表示高匿名，3表示未知）；类型（HTTP还是HTTPS），2个bit位，BIT(2)（0表示HTTP，1表示HTTPS，2表示都可，3表示其他）；ip物理位置，字符串，VARCHAR(100)；响应速度，MEDIUMINT，单位是毫秒ms；最后一次验证的时间，日期时间格式。建表的语句在程序中将给出。其实对这种不断更新、添加的数据，redis更加合适，有关redis的内容将在后续的文章中介绍。3.网页请求分析这里使用的提供代理ip的网站为（笔者给出的例子中，只使用了第一个网址）：http://www.ip3366.net/free/ https://www.kuaidaili.com https://ip.jiangxianli.com/ https://www.cool-proxy.net/ https://free-proxy-list.net https://www.ipaddress.com/proxy-list/ http://proxy-list.org/english/ https://www.proxynova.com/proxy-server-list/ http://pubproxy.com/api/proxy?limit=5&format=txt&type=http&level=anonymous&last_check=60&no_country=CN https://www.rmccurdy.com/.scripts/proxy/good.txt http://spys.one/en/anonymous-proxy-lis…

Python，爬虫与深度学习（2）——爬虫详解（一）爬取金融机构成交持仓排名
type: item
date: 2022-08-30T03:22:00+00:00
description: 步骤/目录： 1.需求分析 2.网页请求分析 3.mysql数据库的设置 4.爬虫编写 （0）安装所需模块 （1）日期 （2）爬虫主体编写 （3）mysql存储 （4）正式运行 5.总结与后续本文首发于个人博客https://lisper517.top/index.php/archives/39/，转载请注明出处。本文的目的是从实战出发讲解爬虫+python。由于还想讲解一下python的写法，所以爬虫写的稍微多了一点。本文写作日期为2022年8月30日。操作的平台为win10，编辑器为VS code。爬虫写的好，牢房进的早。使用爬虫时不要占用服务器太多流量，否则可能惹祸上身。除了python与爬虫，这里实际上还需要了解html格式与mysql命令。可以在 runoob-html 或 runoob-mysql 找到初步的学习资料，或者查看笔者后续的文章。最后，笔者的能力有限，也并非CS从业人员，很多地方难免有纰漏或者不符合代码原则的地方，请在评论中指出。1.需求分析在中国金融期货交易所（中金期货）的官网上有各个金融机构的成交持仓数据，具体网址为 http://cffex.com.cn/ccpm/ 。搜索期货、期权，选择类目、日期，即可看到各机构的成交持仓排名，这个数据可以一定程度上反映各金融机构对大盘走势的判断。本文将介绍如何爬取这些数据，在之后的文章中会试图用机器学习的方法对这些数据进行学习、预判。需求是爬取这些数据，并存入mysql数据库。这里会用到requests、bs4（BeautifulSoup）库，就不用scrapy这种牛刀了（scrapy一般也不会用于爬这种表格请求，而是用于递归爬取全站）。2.网页请求分析在chrome中打开网页，按F12打开网页开发工具，在右上角竖着的三个点里找到 停靠侧 ，选择 取消停靠至单独的窗口 。在网页窗口中选择期货，选择一种类目（比如IF），选择前一天，点击查询，这时网页里会出现数据，网页开发工具里会出现一条新的项目，点击这个项目，发现请求网址为 http://cffex.com.cn/sj/ccpm/2022XX/XX/IF.xml?id=97 ，其中 2022XX/XX 是当天的日期。复制这个请求网址并打开，发现是XML格式的数据（html），其中一项如下：<positionRank> <instrumentid>IF2212</instrumentid> <tradingday>2022XXXX</tradingday> <datatypeid>0</datatypeid> <rank>13</rank> <shortname>宝城期货</shortname> <volume>343</volume> <varvolume>136</varvolume> <partyid>0110</partyid> <productid>IF</productid> ...与原网页对照，其中 datatypeid 可能有0、1、2，分别表示成交量排名、持买单量排名、持卖单量排名。经过实验，网址里的 ?id=97 没有什么具体的意义，大概就是一个1~99的随机数。那么只用日期和品种生成网址就行了。最后检查一下请求和响应里有没有什么特殊的项目，没有则只设置一下请求的User-Agent（UA）即可。3.mysql数据库的设置这里选择用docker在树莓派上运行mysql服务。当然也可以直接安装mysql，各种平台安装mysql的教程见 runoob教程 。无论何种方法运行mysql，最关键的问题是搞清楚运行mysql机器的ip，和mysql的root用户密码。如果不是在本地运行mysql，还要注意mysql的root用户是否能远程登录。在树莓派上进行如下操作：mkdir -p /docker/mysql/data/mysql mkdir -p /docker/mysql/conf/mysql mkdir -p /docker/mysql/backup/mysql docker pull mysql:8.0.29 nano /docker/mysql/docker-compose.yml写入如下内容：version: "3.9" services: mysql: image: mysql:8.0.29 environment: MYSQL_ROOT_PASSWORD: mysqlpasswd ports: - "53306:3306" command: - mysqld - --character-set-server=utf8mb4 volumes: - /docker/mysql/data/mysql:/var/lib/mysql - /docker/mysql/conf/mysql:/etc…