scrapy分页抓取网页(《》爬取第2讲:爬取网站抓取策略)

优采云 发布时间: 2021-09-24 23:08

  scrapy分页抓取网页(《》爬取第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,可能与查看源码得到的不一致。

  我们提取网页内容:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线