西区代码小仓库 - 2022年9月
type: channel
link: https://lisper517.top/2022/09/
description: lisper517的个人博客
items: 路由器与DDNS
items: Python，爬虫与深度学习（15）——番外篇（四）Redis数据库与python
items: Python，爬虫与深度学习（14）——scrapy详解（二）
items: Python，爬虫与深度学习（13）——scrapy详解（一）
items: Python，爬虫与深度学习（12）——sitemap与robots.txt
items: Python，爬虫与深度学习（11）——scrapy中settings的可选项
items: Python，爬虫与深度学习（10）——scrapy+mysql构建ipool
items: Python，爬虫与深度学习（9）——初识scrapy
items: Python，爬虫与深度学习（8）——selenium的使用
items: Python，爬虫与深度学习（7）——建立自己的库

路由器与DDNS
type: item
date: 2022-09-30T14:55:00+00:00
description: 步骤/目录： 1.DDNS简介 2.获取域名 3.配置路由器 4.配置端口转发 5.配置光猫 6.DDNS的安全性本文首发于个人博客https://lisper517.top/index.php/archives/54/，转载请注明出处。本文的目的是介绍DDNS，并在路由器上使用DDNS，以达到访问内网设备的目的。本文写作日期为2022年9月30日。1.DDNS简介想要从公网访问自己的电脑或其他设备，笔者之前的文章中曾详细介绍过frp内网穿透，它的使用流程大概是：购买一台有公网IP的云服务器，在云服务器上运行frps，在需要从公网访问的机器上运行frpc，运行frpc时是将一个或多个内网机器的端口投射到云服务器的端口上，比如多个内网机器的22端口都需要开放到公网，那云服务器自己占一个22端口，其他机器就用云服务器的122、222、322等端口。frp是中心化的，优点是你可以将多个不同局域网（比如你在两个地方各买了一套房子，或者其他情况下不得不把需要投射的机器放在几个不相连的局域网中）的机器端口投射到同一个公网ip，安全性也有保障（如果你会设置tls、双向认证的话）；缺点是带宽等于云服务器的带宽，而云服务器的带宽常常不够用，可能只有 5 Mbps 这种速度（ 625 KB/s ），想看看家里的监控都有点卡。本文介绍的DDNS则是另一种路线，使用流程为：向网络运营商申请公网ip（这个公网ip在每次拨号时都会变化，不是固定的。另外，据说电信的公网IP最容易申请，联通次之，移动基本不可能），到DDNS服务商处申请一个域名，在需要开放到公网的机器上安装DDNS客户端即可。它的原理是，每次装有DDNS客户端的内网机器联网时，都会要求DDNS服务商把你的域名解析到这台机器的公网ip上（所以虽然每次拨号时公网ip可能变化，但都能通过域名确定公网ip）。在实践中，一般这个开放到公网的机器是路由器，因为它开机时间长、不怕断电，能把连到路由器上的其他内网机器的端口投射到路由器上，而且现在很多路由器都自带DDNS客户端支持。DDNS是以域名为中心的，优点是网速可以很快，只和你的路由器速度、宽带（百兆还是千兆）相关；缺点是域名选择比较少（但是花一些钱，也可以把DDNS的域名设置为自己的域名，比如下文的no-ip是29.95$/年），所有要投射的机器都要在同一个局域网下，而且安全性上需要一点注意（在openwrt等固件上可以设置DDNS用HTTPS加密，但是路由器自带的固件很少有支持这个的）。申请公网ip这一步，你需要找到当初帮你装宽带的师傅，或者你这一片区的网络负责人，可以告诉他家里要装监控，想申请一个公网ip，如果是电信、联通的基本都会帮你开。另外据说尽量不要通过10000或10010找师傅，因为这样算投诉、要扣工资，而是应该留一个师傅的私人电话或微信联系。本文中，选择红米AX6S路由器，它自带支持花生壳（oray.com）、公云（3322.org）、 dyndns.com 和 no-ip.com 这四家DDNS服务商，其中笔者选择 no-ip.com ，很多路由器都支持 no-ip.com 。不过路由器支持最多的还是花生壳，可惜比较贵，而且用花生壳据说需要提交身份证信息。如果你想跟着本文实操，最好买一样的路由器，或者自己去找支持DDNS的路由器（同时还需要支持端口转发，一般支持DDNS的路由器都支持端口转发），查看该路由器支持哪些DDNS服务商；不要买太便宜的路由器了，两三百还是要出的，表示一下起码的尊重，如果一切顺利，你需要花钱的地方只有买路由器这一步，原本的路由器就支持DDNS的话甚至可以不用花钱。2.获取域名进入 https://www.noip.com/ ，右上角用自己的邮箱注册一个免费账号（高级账号有一些额外功能，但是这里就用免费账号演示一下），注册的时候可以先不填域名。登录后自己跳转到 https://my.noip.com/ ，点击左侧的 Dynamic DNS -> No-IP Hostnames ，点击 Create Hostname ，这里需要输入自己的域名、选择后缀域名，最后的样子是 自己的域名.后缀域名1.后缀域名2 ，意思就是比如 www.bing.com ，这3者当中你能随意改动的只有 www ； bing.com 则是固定的，不过还是可以有几种选择。自己的域名最好独特一点，否则路由器下线的时候这个域名可能被别人注册（虽然概率极低）；后缀域名最好先试试能否访问，有些后缀域名因没有备案而无法访问。接下来点击右侧的 Account -> Account Info ，在 Basic Info 里把Username改一下。这个用户名和密码要记住，设置路由器要用。然后在右侧点击 Account -> Security ，有个二维码…

Python，爬虫与深度学习（15）——番外篇（四）Redis数据库与python
type: item
date: 2022-09-16T03:54:00+00:00
description: 步骤/目录： 1.Redis简介与安装 2.redis的数据结构 （1）string （2）list （3）set （4）hash （5）zset （6）HLL 3.redis的一些命令 4.redis事务 5.TTL（time to live） 6.排序 7.发布/订阅 8.管道 9.redis GEO 10.其他本文首发于个人博客https://lisper517.top/index.php/archives/53/，转载请注明出处。本文的目的是初步介绍Redis、为爬虫使用redis打好基础，主要整理自 runoob教程 。这里介绍的内容非常浅显，更深入的内容请自行查询书籍。本文写作日期为2022年9月15日。运行的平台为win10和树莓派，编辑器为VS Code。1.Redis简介与安装Redis是一个由 Salvatore Sanfilippo 在2008年开始创造的 key-value 存储系统，是一种开源的非关系型（NoSql）数据库，它的特点有：基于内存，分布式，键值对，支持多种语言的API（Redis本身是由ANSI C写的）。虽然它主要在内存中运行，但也可以将数据保存在磁盘；它支持主从式的数据备份；它的读写性能极高（所以把Redis开放到公网上时还要注意安全性）；它支持事务，多个操作可以打包到一起，要么不执行，要么全部执行（all or nothing）；它支持5种数据类型（字符串，列表，hash散列，集合，有序集合）；它支持推送，key过期。总的来说Redis就是好。在使用Redis时，你可以把它用作主数据库，也可以用作辅数据库，不论何种方式，都是对关系型数据库功能的极大补充。由于redis的一些特性，它特别适合做存储标签这种一对多的工作，而存储标签在mysql这样的关系型数据库中比较麻烦；redis可以设置键的过期时间TTL（time to live），到期后自动过期，这是很多服务都需要的（比如登录cookie的过期）；redis的读写效率非常高，在轻度使用中很少会遇到redis是瓶颈的情况；redis的命令比sql要简单得多（因为它以键值对形式存储数据）。下面介绍三种安装redis的方法。需要注意，redis为了效率而牺牲了安全性，所以默认情况下redis几乎没有保护措施，不要把它开放到外网。在windows上安装redis：window版redis由热心网友维护，版本远落后于linux版或docker版（目前是5.0和7.0的差距），所以不推荐下载。需要的话，建议在windows上用docker安装redis，见 Docker入门（一） 。如果嫌麻烦的话，到 windows版redis下载网页 下载zip文件或msi文件，解压或安装即可。解压zip文件，或用msi文件安装后，在cmd中进入redis目录，运行 redis-server.exe redis.windows.conf 即可运行redis服务器端。然后在同样的目录下，运行 redis-cli.exe -h 127.0.0.1 -p 6379 即可连接到redis数据库。但是要注意，目前它的版本只有5.0，笔者在后续将演示redis使用tls双向验证，但这是redis 6.0后才加入的功能。所以有条件的话还是用docker装redis。在linux上：到 https://download.redis.io/releases/ 下载tar.gz文件，解压、 make 即可。具体过程为：mkdir /usr/local/redis cd /usr/local/redis wget https://download.redis.io/releases/redis-7.0.4.tar.gz #最新版本的redis tar -xzf redis-7.0.4.tar.gz cd redis-7.0.4 apt-get install pkg-config make gcc libssl-dev #一些依赖项 make BUILD_TLS=yesBUILD_TLS=yes 这个选项在redis 6.0以后可用，是用tls在传输层对redis通信加密的一种方式，在后续安全性的部分会提到。这里介绍一下如何用docker安装redis（安装docker、docker-compose请参考 Docker入门（一） 和 Docker入门（二））。在linux上使用如下命令（windows上也是一样的步骤，只是路径改一下）：mkdir -p /docker/redis/data/redis vim /docker/redis/docker-compose.yml写入如下内容：version: "3.9" services: redis: image: redis p…

Python，爬虫与深度学习（14）——scrapy详解（二）
type: item
date: 2022-09-15T08:58:00+00:00
description: 本文较长，属于系统性总结，可作为使用手册查阅。步骤/目录： 1.Debugging Spiders 2.Common Practices 3.Broad Crawls 4.使用浏览器的开发者工具 5.下载图片与文件 6.AutoThrottle extension 7.Benchmarking 8.爬虫的暂停与恢复 9.scrapy架构 10.下载中间件 11.爬虫中间件 12.添加extensions 13.其他本文首发于个人博客https://lisper517.top/index.php/archives/52/，转载请注明出处。本文的目的是详细介绍scrapy，主要翻译自 scrapy官方文档 。本文写作日期为2022年9月15日。运行的平台为win10，编辑器为VS Code。在上一篇文章中，介绍了scrapy的基础概念，现在讲解一些进阶的用法和技巧。1.Debugging Spiders介绍了一些调试爬虫的方式，主要有：（1） scrapy parse 命令。（2） scrapy.shell 类，使用例：from scrapy.shell import inspect_response def parse_details(self, response, item=None): if item: # populate more `item` fields return item else: inspect_response(response, self)（3） scrapy.utils.response 类，可以打开浏览器：from scrapy.utils.response import open_in_browser def parse_details(self, response): if "item name" not in response.body: open_in_browser(response)（4）Logging。（5）Spiders Contracts。2.Common Practices如何使用爬虫。内容包括：（1）使用 scrapy crawl 以外的方式运行爬虫，比如运行多个爬虫或全部爬虫：from scrapy.crawler import CrawlerProcess from scrapy.utils.project import get_project_settings from scrapy.spiderloader import SpiderLoader # 根据项目配置获取 CrawlerProcess 实例 process = CrawlerProcess(get_project_settings()) # 获取 spiderloader 对象，以进一步获取项目下所有爬虫名称 spider_loader = SpiderLoader(get_project_settings()) # 添加全部爬虫 for spidername in spider_loader.list(): process.crawl(spidername) # 添加一个爬虫 #process.crawl('爬虫名') # 执行 process.start()（2）分布式爬取，涉及scrapyd。（3）避免被ban ip，原文的建议有：rotate your user agent from a pool of well-known ones from browsers (google around to get a list of them) disable cookies (see COOKIES_ENABLED) as some sites may use cookies to spot bot behaviour use download delays (2 or higher). See DOWNLOAD_DELAY setting. if possible, use Google cache to fetch pages, instead of hitting the sites directly use a pool of rotating IPs. For example, the free Tor project or paid services like ProxyMesh. An open source alternative is scrapoxy, a super proxy that you can attach your own proxies to. use a highly distributed downloader that circumvents bans inter…

Python，爬虫与深度学习（13）——scrapy详解（一）
type: item
date: 2022-09-15T00:00:00+00:00
description: 本文较长，属于系统性总结，可作为使用手册查阅。步骤/目录： 1.scrapy介绍与安装 2.scrapy使用例一 3.scrapy命令行工具 4.爬虫类 （1）CrawlSpider （2）XMLFeedSpider与CSVFeedSpider （3）SitemapSpider 5.选择器对象 6.Items 7.Item Loaders 8.scrapy shell 9.Item Pipeline 10.Feed exports 11.request与response 12.link extractor 13.settings 14.Exceptions 15.logging 16.Stats Collection 17.Sending e-mail 18.Telnet Console 19.FAQ本文首发于个人博客https://lisper517.top/index.php/archives/51/，转载请注明出处。本文的目的是详细介绍scrapy，主要翻译自 scrapy官方文档 。本文写作日期为2022年9月14日。运行的平台为win10，编辑器为VS Code。1.scrapy介绍与安装scrapy（/ˈskreɪpaɪ/）是一个高效、通用的网页爬取框架，可用于提取页面数据、自动化测试网页、网页归档等。scrapy完全使用python语言（但是它依赖的库有些可能用了其他语言，比如C++），所以安装、使用scrapy之前需要安装、熟悉python。scrapy要求python版本在3.6以上，依赖的库有：lxml, an efficient XML and HTML parser parsel, an HTML/XML data extraction library written on top of lxml, w3lib, a multi-purpose helper for dealing with URLs and web page encodings twisted, an asynchronous networking framework cryptography and pyOpenSSL, to deal with various network-level security needs其中，有些依赖有版本要求：Twisted 14.0 lxml 3.4 pyOpenSSL 0.14使用 pip install Scrapy 即可安装scrapy及其依赖。如果用了Anaconda等包管理器，则使用 conda install -c conda-forge scrapy 命令安装scrapy。另外，官方文档最推荐的是在python虚拟环境中安装scrapy，以避免可能的包冲突，具体见 python官方文档 。2.scrapy使用例一安装好scrapy后，开始使用scrapy爬取一个网站： https://quotes.toscrape.com ，这是一个用来练习爬虫的网站。创建一个放scrapy爬虫的目录，比如 D:\spiders\scrapy 或 ~/spider/scrapy ，然后在cmd或终端中进入该目录，使用 scrapy startproject tutorial 来创建一个scrapy项目，这里的 tutorial 是项目名，你可以自行替换。然后在 tutorial/tutorial/spiders 目录下新建一个爬虫文件，比如 quotes_spider.py ，文件内容如下：import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" def start_requests(self): urls = [ 'https://quotes.toscrape.com/page/1/', 'https://quotes.toscrape.com/page/2/', ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): page = response.url.split("/")[-2] filename = f'quotes-{page}.html' with open(filename, 'wb') as f: f.write(response.body) self.log(f'Saved file {filename}')在这个爬虫类中， name 指定了爬虫名，在一个项目中的爬虫名不能相同； start_requests() 方法用于爬取初始网址，这个方法重写了父类方法，它需要返回…

Python，爬虫与深度学习（12）——sitemap与robots.txt
type: item
date: 2022-09-14T11:13:00+00:00
description: 步骤/目录： 1.介绍 （1）sitemap （2）robots.txt 2.使用scrapy生成sitemap本文首发于个人博客https://lisper517.top/index.php/archives/50/，转载请注明出处。本文的目的是介绍sitemap与robots.txt。本文写作日期为2022年9月14日。运行的平台为win10，编辑器为VS Code。爬虫写的好，牢房进的早。使用爬虫时不要占用服务器太多流量，否则可能惹祸上身。笔者的能力有限，也并非CS从业人员，很多地方难免有纰漏或者不符合代码原则的地方，请在评论中指出。1.介绍如果感觉这些概念有些抽象，可以访问一些网址看看范例，比如 https://www.baidu.com/robots.txt 、 https://img.kuaidaili.com/sitemap.xml 等。（1）sitemapsitemap是一个站点的网页地图，它可以帮助爬虫，给出哪些网页可供抓取（sitemap应该只包含允许爬取的网页）、和各网址的基础数据（更新时间、更新频率、重要程度等）。因为搜索引擎都需要爬虫来获取网页的详情，用sitemap可以做SEO（search engine optimization，搜索引擎优化），这样baidu、google等各大搜索引擎的爬虫能爬到自己网页的页面，则在搜索关键字时自己网页出现的频率也会升高。sitemap的格式等信息可以到 sitemap官网 查看，下面是一份范例：<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>http://www.example.com/</loc> <lastmod>2005-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> <url> <loc>http://www.example.com/.../.../</loc> <lastmod>2005-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> ... </urlset> 一个编写好的sitemap，一般会放在网站的根目录下，命名为sitemap.xml。另外，除了被动等待自己的网页被搜索引擎爬取，还可以自己向搜索引擎提交sitemap；wordpress等模板在建站后会自动生成sitemap。（2）robots.txtrobots.txt也是一个建议爬虫如何爬取自己网站的文件，同样也放在网站根目录下。它的格式为：User-agent: * Allow: / Disallow: / Sitemap: http://www.***.com/sitemap.xmlUser-agent后面用于指定搜索引擎爬虫，比如Googlebot、Baiduspider、， * 则表示对所有爬虫适用；Allow、Disallow后面跟允许或禁止爬取的目录，只写目录名不用写全网址；Sitemap则是指明自己网站的sitemap在哪里，这个只用写一次（User-agent、Allow和Disallow则可能出现多次）。另外，如果写成：User-agent: Googlebot Allow: / User-agent: * Disallow: /就是允许google爬虫访问自己的全部页面，但禁止其他爬虫访问自己的全部页面。这个例子的重点在于前面指明单个爬虫，后面用通配符*表示其他所有爬虫。2.使用scrapy生成sitemap首先要提醒，这种方式其实和爬虫软件去爬取你的页面一样。如果你的网站，网页之间内链不多，建议还是从网站的根目录或者数据库里生成sitemap。安装好python、scrapy环境后，在win10机器上的cmd中使用如下命令：cd 放scrapy爬虫的目录 scrapy startproject sitemap cd sitemap scrapy genspider sitemap_mysite example.com然后开始编辑scrapy项目。items.py如下：# Define here the models for your scraped items # # See documentation in: # https://docs.scrapy.org/en/latest/topics/items.html import scrapy class Sitemap…

Python，爬虫与深度学习（11）——scrapy中settings的可选项
type: item
date: 2022-09-14T06:27:00+00:00
description: 步骤/目录： 1.settings的指定方法 2.setting中的常用设置与默认值 （1）爬虫效率相关 （2）字典类设置 （3）log相关 （4）其他的重要设置 （5）其他的不重要设置本文首发于个人博客https://lisper517.top/index.php/archives/49/，转载请注明出处。本文的目的是介绍scrapy的settings的可选项及使用方法。本文写作日期为2022年9月14日，主要参考了 scrapy官方文档 。爬虫写的好，牢房进的早。使用爬虫时不要占用服务器太多流量，否则可能惹祸上身。笔者的能力有限，也并非CS从业人员，很多地方难免有纰漏或者不符合代码原则的地方，请在评论中指出。1.settings的指定方法一共有5种指定settings的方法：（1）爬虫单独指定，就是在爬虫类下面用 custom_settings 数据成员指定，如：class MySpider(scrapy.Spider): name = 'myspider' custom_settings = { 'CONCURRENT_REQUESTS': 1, 'DOWNLOAD_DELAY': 10, 'CONCURRENT_REQUESTS_PER_DOMAIN': 1 }这种方法适合有多个爬虫、多个网站，但有些网站需要调整设置的时候，比较常用。（2）命令行指定，即 scrapy crawl myspider -s LOG_FILE=scrapy.log 这样的格式，缺点是能指定的项比较少，只能用来覆盖部分settings.py里的设置。另外的三种方法比较进阶，这里就不介绍了。最后，在爬虫类里，可以通过 self.settings 调出爬虫的设置。2.setting中的常用设置与默认值这里提到的settings可选项只是很少一部分，其他的要不就是更加进阶，要不就是一般不会用到。（1）爬虫效率相关CONCURRENT_ITEMS=100 ，设置每个响应拿到后有多少个item pipeline同时运行。由于爬虫的瓶颈一般在网络，这个设置没有太大用处。CONCURRENT_REQUESTS=16 ，下载器最多能同时发送多少个请求。对于一些封ip的网站，需要用这个设置。CONCURRENT_REQUESTS_PER_DOMAIN=8 ，对一个域名最多发送多少请求。对于一些封ip的网站，可以用这个设置。CONCURRENT_REQUESTS_PER_IP=0 ，对一个ip最多发送多少请求。如果设置了这个，则 CONCURRENT_REQUESTS_PER_DOMAIN 会失效。DOWNLOAD_DELAY=0 ，用于设置从同一网站爬取连续页面时的等待时间，单位为秒（可以用浮点数）。对于一些封ip的网站，需要用这个设置。这个等待时间不是定死的，实际的时间会在0.5倍~1.5倍 DOWNLOAD_DELAY 之间浮动（若不想浮动，用 RANDOMIZE_DOWNLOAD_DELAY=False 来指定，但一般不要这样做，因为有些网站通过分析请求间隔来判别爬虫）。除了在爬虫类中用 custom_settings 指定、在 settings.py 里指定，还可以通过爬虫的 download_delay 属性来指定。总结一下，如果有些网站会封访问频繁的ip，可以在爬虫类里使用： custom_settings = { 'CONCURRENT_REQUESTS': 1, 'DOWNLOAD_DELAY': 10, 'CONCURRENT_REQUESTS_PER_DOMAIN': 1 }这样的设置来限制访问频率。（2）字典类设置这些设置一般都是指定中间件等类，和它们的优先级（或者顺序），一般越小优先级越高。DOWNLOADER_MIDDLEWARES ，用于设置下载中间件及其优先级。EXTENSIONS ，类似 DOWNLOADER_MIDDLEWARES ，用于指定扩展及其优先级。ITEM_PIPELINES ，用于指定item pipelines及其优先级。（3）log相关scrapy使用的是python自带的logging模块，所以有些设置需要参考logging。LOG_ENABLED=True ，是否允许记录log。LOG_ENCODING='utf-8' ，log的字符集。LOG_FILE=None ，logging输出的文件名。为None时，使用standard error。LOG_FILE_APPEND=True ，如果为False，每次运行时会覆盖 LOG_FILE 指定的log文件。LOG_FORMAT='%(asctime)s [%(name)s] %(levelname)s: %(message)s' ，指定每条log的格式。想自…

Python，爬虫与深度学习（10）——scrapy+mysql构建ipool
type: item
date: 2022-09-13T02:01:00+00:00
description: 步骤/目录： 1.运行mysql数据库与准备工作 2.自建库 3.创建、修改、运行scrapy项目 （1）其他配置 （2）爬虫配置 a.a2u.py b.clarketm.py c.cool_proxy.py d.free_proxy_list.py e.ip3366.py f.ipaddress.py g.jiangxianli.py h.kuaidaili.py i.pubproxy.py j.rmccurdy.py k.sunny9577.py l.TheSpeedX.py （3）运行爬虫 4.验证ip 5.日常使用本文首发于个人博客https://lisper517.top/index.php/archives/48/，转载请注明出处。本文的目的是使用 scrapy+mysql 搭建一个自己的代理ip池，即ipool。由于本文是对前文进行阶段性总结+拓展，所以内容较多，笔者希望本文单独拿出来也能成功跟着一步步操作。本文写作日期为2022年9月11日。mysql数据库运行在树莓派上，其他部分运行在win10机器；使用的编辑器为VS Code。爬虫写的好，牢房进的早。使用爬虫时不要占用服务器太多流量，否则可能惹祸上身。笔者的能力有限，也并非CS从业人员，很多地方难免有纰漏或者不符合代码原则的地方，请在评论中指出。1.运行mysql数据库与准备工作笔者在树莓派上使用docker安装mysql，需要预先安装docker、docker-compose，在树莓派上安装docker、docker-compose可查看 Docker入门（一） 。也不一定非要在树莓派上运行mysql，或者也不一定要用docker，或者也可以用redis等其他数据库代替mysql（使用其他数据库时后续的py文件可能需要自行调整），反正最终的目的是运行一个数据库，可以参考 runoob教程 使用其他方法安装运行mysql数据库。在树莓派上进行如下操作：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在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/mysql/conf.d - /docker/mysql/backup/mysql:/backup logging: driver: syslog restart: always记得把 MYSQL_ROOT_PASSWORD: mysqlpasswd 这里改成自己想设置的密码，把 53306 也可以改成自己想要的端口（不建议用默认的3306端口）。这里的 /docker/mysql/backup/mysql 目录是为了方便docker-mysql导出、备份数据。然后运行：cd /docker/mysql docker-compose config docker-compose up -d接下来进容器服务里看看mysql是否正常运行：docker exec -it mysql-mysql-1 bash #如果是老版本的docker-compose，把这一条命令中的所有 - 换成 _ mysql -uroot -p #输入密码 SHOW DATABASES;确认mysql正常运行即可。为了保证创建database和table的命令能记录下来，这些命令将写在python文件中。然后在win10机器上准备一下环境。需要安装python3，安装scrapy和其他库，创建自建库文件夹，创建scrapy项目文件夹。win10机器安装python3的过程这里就不讲了。安装好后，在cmd中运行 pip install Scrapy ，其他可能需要的库还有requests（处理网络请求）、bs4（对响应内容进行解析）、pymysql（连接mysql数据库）、lxml（网页解析器）、cryptography（连接mysql时密码加密）、seleniu…

Python，爬虫与深度学习（9）——初识scrapy
type: item
date: 2022-09-11T11:48:00+00:00
description: 步骤/目录： 1.应用场景与scrapy架构 2.安装scrapy与创建项目 3.使用scrapy爬取http://www.ip3366.net/free/ （1）创建项目与修改框架 （2）自建库文件的内容 （3）运行爬虫本文首发于个人博客https://lisper517.top/index.php/archives/47/，转载请注明出处。本文的目的是讲解scrapy的使用方法。本文写作日期为2022年9月10日。爬虫写的好，牢房进的早。使用爬虫时不要占用服务器太多流量，否则可能惹祸上身。笔者的能力有限，也并非CS从业人员，很多地方难免有纰漏或者不符合代码原则的地方，请在评论中指出。1.应用场景与scrapy架构在之前 Python，爬虫与深度学习（6）——爬虫详解（二）构建自己的ip池（简易版） 这篇文章中，提到过 https://free.kuaidaili.com/free/ 这个网站，它列出了4700多页免费代理ip。爬取这些ip是比较耗时的，但还算比较简单，因为需要爬取的每个网页的网址，区别只在最后的页码数字不同。如果我遇到一个网站，我想爬取它的全站数据，也就是说从它的根页面开始，把根页面需要的数据爬取下来，然后提取出根页面上的所有符合条件的超链接（仅提取属于这个网站的，比如下面有备案信息的网页会提供一个到工信部备案的链接，这种链接就不要），依次访问这些链接，对这些链接也都重复 爬取数据、提取链接 这两步，这样一直重复下去，就能爬取该站所有在页面上出现过的链接（有些链接可能在所有页面上都没出现过，这种隐藏起来的链接就没办法了），也就是一般意义上的爬取全站数据。但是要注意，有些时候网页会故意放一些正常人无法看到的链接（在浏览器页面上无法显示的链接，比如超出显示范围，或者没有写内容的a标签等），爬虫通过阅读源码能轻易找到，但是如果访问到这个页面，网页服务器就会识别到你是爬虫，不再提供服务，这也是一种反爬方法。作为写爬虫的一方，我们能做到的是把提取链接的规则写小一点，少用正则提取页面上的所有链接。scrapy就是一种用于全站爬取的爬虫框架，关于它组件的介绍见 runoob教程 ，这里简单介绍一下。用scrapy爬取一个网站的流程是，从一个初始url开始，下载器（Downloader）通过url获得响应，拿给爬虫（Spider）解析、提取出信息和其他要访问的url，把信息交给管道（Item Pipeline）进行存储，比如存成txt文件或存入数据库；其他url则在爬虫中以请求的形式送入调度器（Scheduler），等待合适的时机交给下载器继续下载。另外还有下载中间件和Spider中间件，用于自定义配置，比如有时你想用selenium获得请求，那么就在中间件里把获得响应的部分进行修改。另外，4个组件的中心是scrapy引擎，这个核心组件负责调度、传递组件间的信息。最后，scrapy爬取网页是采用多进程的方法，所以爬起来非常快，但是也要注意可能被封ip。所以在使用scrapy之前，最好手上已经有一定的代理ip。2.安装scrapy与创建项目使用 pip install Scrapy 安装scrapy，然后在cmd或终端中，进入放scrapy爬虫项目的文件夹（这个文件夹以后可以专门用来放爬虫），创建项目：scrapy startproject 爬虫项目名然后进入项目文件夹，创建爬虫：scrapy genspider 爬虫名 "爬虫要爬的网址"网址可以随便写，文件里可以修改。另外，一个项目里可以有多个爬虫。对项目里的各个文件进行修改，最后使用 scrapy crawl 爬虫名 运行爬虫。下面就展示一下如何修改这些文件。3.使用scrapy爬取http://www.ip3366.net/free/这里以 http://www.ip3366.net/free/ 为例，展示一下scrapy的使用，需要爬取该网站的ip。以下的命令在win10机器上运行。（1）创建项目与修改框架新建一个文件夹，比如 D:\spiders\scrapy ，然后进行如下操作：scrapy startproject ipool cd ipool scrapy genspider ip3366 http://www.ip3366.net/free/在创建过程中，可以看到scrapy有框架模板、爬虫模板，目前使用的是默认模板。以后对爬虫若有一定要求，可编写自己的模板。然后在资源管理器中进入 D:\spiders\scrapy\ipool\ipool ，可以看到items、middlewares、pipelines、settings，和ip3366这五个py文件，接下来修改这几个文件。items.py原内容如下：# Define here the models fo…

Python，爬虫与深度学习（8）——selenium的使用
type: item
date: 2022-09-10T01:45:00+00:00
description: 步骤/目录： 1.应用场景 2.准备工作 3.在个人库中添加selenium相关代码 4.selenium个人库使用范例本文首发于个人博客https://lisper517.top/index.php/archives/46/，转载请注明出处。本文的目的是讲解selenium，并在个人库中添加相应代码。本文写作日期为2022年9月10日。笔者的能力有限，也并非CS从业人员，很多地方难免有纰漏或者不符合代码原则的地方，请在评论中指出。1.应用场景在爬虫泛滥的今天，各网站采用了越发先进的方法识别爬虫。如果不是经验丰富的爬虫老手，总会在爬某个网站时翻车（老手也是从翻车一步步过来的）。如果对爬取速度要求不是太高，就可以使用selenium与实际的浏览器搭配爬取网页。目前很多网站使用了JavaScript在客户端生成页面，selenium的方法就十分适合爬取这些网页；如果无论怎么办都会被识别，笔者能提供的最终解决方案是手动开启浏览器并交给selenium控制。selenium由于要操作浏览器而速度稍慢，这是其唯一的缺点。2.准备工作下载selenium：pip install selenium另外，edge刚推出时，老版本的selenium还需要下msedge-selenium-tools来帮助扩展edge功能，现在已经不用了。如果新版selenium用不了edge的话，使用 pip install msedge-selenium-tools 来安装这个扩展包，并且selenium也会回到老版本。下载浏览器：去官网下载chrome、edge、firefox浏览器，注意不要下到别人暗改的版本了。老的爬虫教程可能会推荐下载phantomjs浏览器，这是一个没有界面的浏览器，现在很多网站都对phantomjs浏览器有一些识别与限制，所以已经不建议再使用了，何况chrome、edge、firefox也支持无界面。最后是下载webdriver，即浏览器驱动，注意的是和浏览器版本匹配。有些时候浏览器升级了，也要及时更换驱动。chrome、edge、firefox的驱动下载网址各自为：https://chromedriver.chromium.org/downloads https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ https://github.com/mozilla/geckodriver/releases以chrome为例，打开浏览器，在网址栏输入 chrome://version/ ，可以看到版本（还有 可执行文件路径、个人资料路径 ，下面可能会用到），根据版本选择对应的chrome驱动即可。最后，记下 可执行文件路径 ，把三个浏览器的驱动都放在一个文件夹中，比如 D:\webdrivers ，然后在个人库中添加selenium相关的代码。笔者下面将给出在win10机器上selenium的一种使用方法，可根据自身情况对代码进行修改。除了自己对selenium二次开发，还可以看看别人的成品，比如helium。3.在个人库中添加selenium相关代码添加一个driver类，需要实现的功能有：根据网页返回网页源码，和返回某个标签对象。from logging import Logger import selenium, os from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options as ChromeOptions # chrome from selenium.webdriver import Edge from selenium.webdriver.edge.options import Options as EdgeOptions #from msedge.selenium_tools import Edge, EdgeOptions # edge(支持新版edge需要安扩展包pip install msedge-selenium-tools) from selenium.webdriver import Firefox from selenium.webdriver.firefox.options im…

Python，爬虫与深度学习（7）——建立自己的库
type: item
date: 2022-09-06T06:31:00+00:00
description: 步骤/目录： 1.创建文件夹及添加路径 2.自建库的编写 （1）log.py （2）mysql.py （3）spider.py （4）interaction.py本文首发于个人博客https://lisper517.top/index.php/archives/45/，转载请注明出处。本文的目的是讲解自建库的编写，并初步添加一些函数。本文写作日期为2022年9月6日。使用的平台为win10，编辑器为VS code。在python的日常使用中，我们常常需要复用一些代码，有时可以把这些代码写成函数，存在自建库中备用。本文将演示如何自建python库，并添加一些基础的函数到自建库中。1.创建文件夹及添加路径在一个合适的地方新建一个文件夹，用于存储自己写的库。本例中，该文件夹为 D:\PythonLib\MyPythonLib （以后所有自建库都放在这个文件夹里），注意这个文件夹要创建两层。然后新建一个文件： D:\PythonLib\MyPythonLib\__init__.py 。linux下也是同样的操作。然后把这个库添加到python的库路径中。找到python的根目录里存放库的文件夹，比如 C:\Program Files\Python310\Lib\site-packages （linux系统中一般在 /usr/lib/python3/dist-packages ），在这里新建一个.pth文件，比如 PythonLibs.pth ，写上自建库文件夹的位置，即 D:\PythonLib ，linux系统可以写上 /root/PythonLib/MyPythonLib 。2.自建库的编写然后就是编写自建库，在编写自建库时应该慎重，有些地方宁可写复杂一点，也要使代码简单易懂、便于维护；在处理异常时也要更加谨慎，避免有些时候是这些自建函数出现问题，却半天排查不到；注释要详尽，确保第一次用的人也能看懂。有如下的几个函数可以写成自建库：（1）log.pyimport logging import time import os def get_logger(abs_path: str, log_file_name: str = '', getLogger_name: str = ''): '''传入绝对路径和log文件名，返回log对象。 :param abs_path: log文件存储的绝对路径 :param log_file_name: log文件名，若log文件名为空，则使用默认的文件名 :param getLogger_name: logger对象名，如果在同一个程序中需要同时写多个log文件，建议这个参数不要相同 :return log对象''' try: formatter = logging.Formatter( '%(lineno)d : %(asctime)s : %(levelname)s : %(funcName)s : %(message)s' ) if log_file_name == '': log_file_name = 'log#{}.txt'.format(time.strftime('-%Y-%m-%d')) fileHandler = logging.FileHandler( (os.path.join(abs_path, log_file_name)), mode='w', encoding='utf-8') fileHandler.setFormatter(formatter) if getLogger_name == '': getLogger_name = 'logger' log = logging.getLogger(getLogger_name) log.setLevel(logging.DEBUG) log.addHandler(fileHandler) return log except: raise Exception('error: MyPythonLib.log.get_logger failed ')（2）mysql.py注意把mysql连接的服务器ip，端口，用户密码改成自己的。import pymysql def get_conn(database_name: str = 'mysql'): '''指定数据库名，返回mysql连接对象。 :param database_name: 数据库名，不指定时默认用mysql库 :return conn''' try: conn = pymysql.connect(host='127.0.0.1', port=53306, user='root', passwd='mysqlpasswd', db=database_name, c…