scrapy分页抓取网页(《》爬取第2讲:爬取网站抓取策略)
优采云 发布时间: 2021-09-24 23:08scrapy分页抓取网页(《》爬取第2讲:爬取网站抓取策略)
显式爬取网站:
爬取策略:关注所有文章页面,逐页爬取。
具体策略一:改变页码值
缺点:当总页数发生变化时,需要修改源代码
具体策略二:一步一步提取下一页,不需要随着页面变化而修改源代码
下面是策略二。
准备好工作了:
创建一个新的虚拟环境:
C:\Users\wex>mkvirtualenv article
Using base prefix 'c:\\users\\wex\\appdata\\local\\programs\\python\\python35'
New python executable in C:\Users\wex\Envs\article\Scripts\python.exe
Installing setuptools, pip, wheel...done.
创建项目:
I:\python项目>scrapy startproject ArticleSpider
New Scrapy project 'ArticleSpider', using template directory 'c:\\users\\wex\\appdata\\local\\programs\\python\\python35\\lib\\site-packages\\scrapy\\templates\\project', created in:
I:\python项目\ArticleSpider
You can start your first spider with:
cd ArticleSpider
scrapy genspider example example.com
根据默认模板创建爬虫文件:
I:\python项目\ArticleSpider>scrapy genspider jobbole blog.jobbole.com
Created spider 'jobbole' using template 'basic' in module:
ArticleSpider.spiders.jobbole
Scrapy 启动一个蜘蛛方法(名字就是蜘蛛中的名字):
scrapy crawl jobbole
当报错时:
ImportError: No module named 'win32api'
根据错误安装:
I:\python项目\ArticleSpider>pip install pypiwin32
Collecting pypiwin32
Downloading pypiwin32-219-cp35-none-win_amd64.whl (8.6MB)
100% |████████████████████████████████| 8.6MB 88kB/s
Installing collected packages: pypiwin32
Successfully installed pypiwin32-219
这时候重启是不会报错的。
在 Pycharm 中新建一个 main.py 文件来运行蜘蛛文件。
#调用这个函数可以执行scrapy文件
from scrapy.cmdline import execute
import sys
import os
#设置ArticleSpider工程目录
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
#调用execute函数运行spider
execute(["scrapy","crawl","jobbole"])
请注意,在设置文件中:
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
防止不符合协议的url被过滤掉。
关于 xpath:介绍、术语、语法
1. XPath 使用多路径表达式在 xml 和 html 中导航
2. xpath 收录标准函数库
3. XPath 是 w3c 标准
xpath 节点关系
1、父节点
2. 子节点
3. 兄弟节点
4. 高级节点
5. 后代节点
语法:选择节点
表达式 说明
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
article 选取所有article元素的所有子节点
/article 选取根元素article
article/a 选取所有属于article的子元素的a元素
//div 选取所有div元素(不论出现在文档任何地方)
//@class 选取所有名为class的属性
谓词
谓词用于查找特定节点或收录指定值的节点。
谓词嵌入在方括号中
/article/div[1] 选取属于article子元素的第一个div元素
/article/div[last()] 选取属于article子元素的最后一个div元素
/article/div[last()-1] 选取属于article子元素的倒数第二个div元素
/article/div[last()35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
选择未知节点
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
/div/* 选取属于div元素的所有子节点
//* 选取所有元素
//div[@*] 获取所有有带属性的div元素
/div/a | /div/p 获取所有div元素的a和p元素
//span | //ul 选取文档中的span和ul元素
article/div/p | //span 选取所有属于article元素的div元素的p元素 以及文档中所有的span元素
有一点需要注意:查看F12得到的包括加载js和css,可能与查看源码得到的不一致。
我们提取网页内容: