西区代码小仓库 - 爬虫
type: channel
link: https://www.lisper517.top/category/Spider/
description: 爬虫写好，监狱进早
items: 《Python网络数据采集》-Ryan Mitchell（笔记）
items: Docker实践——MDC与plex
items: Python，爬虫与深度学习（16）——电影的信息爬取、下载与处理（一）
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的使用

《Python网络数据采集》-Ryan Mitchell（笔记）
type: item
date: 2025-12-17T14:05:01+00:00
description: 步骤/目录： 无本文首发于个人博客https://lisper517.top/index.php/archives/4247/，转载请注明出处。本文的原文写作日期为2020年9月17日，主要目的是总结《Python网络数据采集》。下面的内容有些缩进或者图片缺失，可以参考 原word文档 。1.本书使用标准urllib模块和非标准模块bs4模块： from urllib.request import urlopen from bs4 import BeautifulSoup html = urlopen("http://www.pythonscraping.com/pages/page3.html") bsObj = BeautifulSoup(html) 2.find_all()方法相关： find_all(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs) method of bs4.BeautifulSoup instance 第一个参数name为标签名，为None时可匹配所有标签名； 第二个为标签属性，常以字典形式给出； 第三个为是否递归查找，除非十分了解网页格式且有时间要求，一般情况下都取True； 第四个为匹配标签内容； limit为查找返回个数限制，为1时该方法等同find方法； 最后是一些其他参数。 3.html格式相关： 子节点（children）和后代节点（descendant），子节点仅为下一级的标签，后代节点包含所有下级标签： for child in bsObj.find("table",{"id":"giftList"}).children: print(child) 这些相关节点都是包含空格、换行的，处理时务必去掉 兄弟标签：next_siblings为后续的所有同级标签，previous_siblings相反。这两个都有去掉s的形式。 父标签与祖先标签：parent和parents 4.常用re符号： 5.用attrs方法返回一个标签的所有属性（字典形式） 6.scrapy应用：自学 7.API，应用编程接口，有严格的语法，用XML或json表示数据。 HTTP常用方法：get，请求网页信息；post，用户提交信息；put，请求更新某个数据；delete，请求删除某个数据。 8.使用twitter库获取推文、更新推文等；利用google、baidu提供的API。 9.用urllib.request.urlretrieve下载文件 10.学习mysql mysql基础命令： net start mysql 启动sql网络服务；CREATE DATABASE scraping 创建数据库；USE scraping 使用数据库； >CREATE TABLE pages (id BIGINT(7) NOT NULL AUTO_INCREMENT, title VARCHAR(200), content VARCHAR(10000), created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id)); 用以上头创建数据库中的表； > INSERT INTO pages (title, content) VALUES ("Test page title", "This is some te st page content. It can be up to 10,000 characters long."); 向表中插入数据； >SELECT * FROM pages WHERE title LIKE "%test%"; 查找数据； 删除只需要把对应的SELECT换成DELETE即可。记得先确认，加上WHERE。 >UPDATE pages SET title="A new title", content="Some new content" WHERE id=2; 更新数据。 ALTER DATABASE scraping CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; 将scraping数据库的字符集从utf8mb4改为utf8mb4_unicode_ci。 用pymysql在python中使用mysql： import pymysql conn = pymysql.connect(host='127.0.0.1', user='root', passwd='aboutime', db='mysql')# 创建连接对象 cur = conn.cursor()# 创建游标对象 cur.execute('U…

Docker实践——MDC与plex
type: item
date: 2023-11-30T08:28:00+00:00
description: 步骤/目录： 1.背景介绍 （1）MDC （2）Plex 2.MDC的使用 3.EverAver的使用 4.Plex的使用 （1）XBMCnfoMoviesImporter插件下载 （2）安装与设置 5.linux + docker安装plex （1）docker-compose的编写 （2）插件与设置 （3）头像 a.失败方法一 b.失败方法二 c.总结 d.方法三 e.方法四 f.修改nfo标签 （4）内网穿透 （5）显卡加速（未实操） a.卸载之前的CUDA、驱动 b.查看显卡是否可用CUDA c.安装NCT d.安装CRI-O e.配置 f.安装显卡驱动 g.安装驱动后检查 h.plex-docker开启硬件加速本文首发于个人博客https://lisper517.top/index.php/archives/92/，转载请注明出处。本文的目的是对本地电影文件进行整理，并搭建个人影音库。本文写作日期为2023年11月30日。用到的系统有win10、Ubuntu 22.04 LTS。1.背景介绍在 Python，爬虫与深度学习（17）——电影的信息爬取、下载与处理（二） 一文中，笔者曾经试图对本地电影文件进行压缩，并通过mysql库管理。压缩视频没有什么问题，但是根据视频文件名进行查询、归类时，由于文件名参差不齐，涉及的爬虫知识又比较复杂，笔者还想对视频内容进行比对，却一直没有好的解决办法。好在互联网上总是有人在做相似的项目，今天介绍的MDC就比较好地满足了这类需求。在文件管理上，笔者选择用废旧笔记本装linux连硬盘，Samba共享，详情参考 树莓派+Samba+frp搭建NAS（网络云存储） 。当然，树莓派的孱弱性能不太适合装plex，这里用笔记本代替。（1）MDCMovie_Data_Capture 刮削软件，项目地址 。可以识别本地视频文件名，到Java网站上查询，下载海报，生成nfo文件（这些工作称为刮削），根据主演名创建文件夹。其它类似的软件有AVDC，MDCx（原作者似乎在23-10-4删库），tinyMediaManager（正常情况下用的最多。这里不用tMM是因为本文主要讨论不正常的情况），EverAver（只能对单部电影刮削）等。另外，对于英语电影，可以使用tMM + 插件，具体可参考 提供插件的网站 （该网站目前转移到了 另一个地址 ）。在该插件网站注册一个账号，右上角点击头像可获得API token，MDCx可填入该API，或者tMM安装插件后也需填入该API。tMM插件的github项目地址 在此 ，把插件放到tMM安装路径的Addons文件夹里（新建一个）。（2）Plexplex官网 ，一个功能比较齐全的本地影音库解决方案。在存放电影文件的本地电脑上安装plex media server，只要该本地电脑能联网，就能在外网通过plex的客户端（安卓，苹果，Windows，Mac）或者网页端访问、管理电影文件。当然，在外网看是要花钱充会员的（在局域网内不用钱，所以也可以内网穿透）；且plex只能用自带的播放器。其实plex和流媒体有很多相似之处，也能看一些电视、美剧。需要注意的是，plex也可对电影进行识别（文件名，还会对视频内容进行比对），获得海报、生成nfo，但在一些细分领域的识别正确率不高。plex需要使用XBMCnfoMoviesImporter插件才能识别本地的nfo文件，这将在之后讲解。其它类似的有Jellyfin、Emby（Jellyfin是Emby的开源版本，Jellyfin疑似在文件较多时无法运行），Jvedio（可以用本地播放器，缺点是电影名的.必须改成-）等。plex是目前最成熟的影音管理软件，但是也有其它小问题。2.MDC的使用由于涉及爬虫，运行时请确认能够访问外网，最好是日服。可参考 Docker实践——如何查阅wiki百科及V2Ray 或者 Google云的免费使用。在 MDC发行版 中选择合适的版本进行下载。需要注意MDC最新的版本（7.0.1以后）开始内测，需要付费，有实力的读者可以支持一波。本文使用免费的6.6.7版本（最后一个免费版本）进行演示。对压缩文件解压，得到config.ini（配置文件）和exe文件。配置文件修改以下几处：stop_counter = 10 #默认为stop_counter = 0 rerun_delay = 1m #默认为rerun_delay = 0 [watermark] switch = 0 #默认为switch = 1 [storyline] switch = 0 #默认为switch = 1更多配置选项参考 配置说明 （该6.6.7版本配置说明网页在本文写作的这几天已失效）。接下来，将ini文件和exe文件放到存放电影的文件…

Python，爬虫与深度学习（16）——电影的信息爬取、下载与处理（一）
type: item
date: 2022-10-03T03:16:00+00:00
description: 步骤/目录： 1.需求介绍 2.准备工作 （0）安装python库 （1）创建scrapy项目 （2）创建并运行mysql （3）创建并运行redis （4）创建python自建库 a.log.py b.redis.py c.mysql.py d.interaction.py e.torrent_parser.py f.其他 3.scrapy项目的修改 （1）items.py （2）middlewares.py （3）pipelines.py （4）settings.py （5）爬虫 4.使用说明本文首发于个人博客https://lisper517.top/index.php/archives/55/，转载请注明出处。本文的目的是使用scrapy爬取电影的信息。本文写作日期为2022年10月3日。运行的平台为win10和树莓派，编辑器为VS Code。1.需求介绍在日常生活中，我们常常会想要看一些精彩的电影，但是看电影又比较费时间，所以最好能把电影信息爬取下来，通过一些方法筛选出想要的电影，再通过一些标准筛选出对应的磁力链接或其他下载链接，下载电影到本地，最后对本地存储的电影信息进行入库、对占用空间较大的电影进行压缩等。本文是系列文章的第一篇，目的是使用scrapy从电影信息网站上爬取数据。为了方便，本文选择了一个能同时提供电影磁链的网站，该网站提供了演员主页，收录了每位演员出演的电影。由于笔者挑选电影时有演员偏好，所以打算收藏喜欢的演员的主页，根据演员来挑选电影。2.准备工作（0）安装python库笔者也搞不太清楚需要哪些库了，不过推荐安装的有以下这些：Scrapy（python-scrapy）、requests（处理网络请求）、bs4（对响应内容进行解析）、pymysql（连接mysql数据库）、lxml（网页解析器）、cryptography（连接mysql时密码加密）、selenium（操控浏览器）、redis（python-redis）。如果后续运行时有些依赖的库没安装，请自行安装。（1）创建scrapy项目在爬取磁链时，这些数据是通过javascript动态生成的，所以这个项目就命名为javaspider。在win10电脑上的cmd中运行如下命令：D: cd D:\spiders\scrapy scrapy startproject javaspider scrapy genspider java（2）创建并运行mysql这里选择在树莓派上通过docker运行mysql，具体的操作步骤见 Python，爬虫与深度学习（10）——scrapy+mysql构建ipool 这篇文章。mysql中主要有两张表，movie和torrent，分别存储电影和磁链的信息。库、表的创建将使用python，这里不单独创建。（3）创建并运行redis这里还要使用到redis，因为一个演员不止出演一部电影，一部电影通常也不止一个tag，并且筛选磁链时还可能用到磁链中的文件（也是一对多的关系）。这种一对多、无重复的表用redis的集合比较容易实现，而用mysql这样的关系型数据库比较复杂。由于redis对内存的要求比较大，这里就在win10机器上运行docker-redis。在windows上安装docker（即安装docker-desktop）的方法见 Docker入门（一）。在win10上运行容器的过程是一样的，比如cmd执行如下命令：D: md D:\docker\redis\data\redis然后新建一个 D:\docker\redis\docker-compose.yml compose模板文件，写入以下内容：version: "3.9" services: redis: image: redis ports: - "56379:6379" volumes: - D:\docker\redis\data\redis:/data logging: driver: json-file restart: always 最后运行：cd D:\docker\redis docker-compose config docker-compose up成功运行redis。注意这种方法运行的redis是完全没有安全措施的，不要开放到外网了。另外，为了使用redis-cli，可以在wsl环境（如果你是按照 Docker入门（一） 的方法在win10上运行docker，应该清楚wsl是什么）里安装redis。在cmd中进行如下操作：wsl -d Ubuntu-20.04 #如果你也用的是Ubuntu-20.04的话 cd /mnt/d/docker/redis wget https://download.redis.io/releases/redis…

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…