最近因为想要构建自己的应用程序,所以需要用到爬虫,然后就开始了爬虫的鼓捣和学习。为了让大家更快的入门一款爬虫,为大家讲解一下scrapy的基本原理,和快速上手使用,爬取的页面是伯乐在线,大家可以去提前熟悉一下。
操作系统:WIN10
IDE: 使用的是全家桶Pycharm
1. 全局安装scrapy
pip install scrapy -g
2. 创建一个存放项目的文件夹
mkdir Spider-Python3
3. 创建scrapy工程
scrapy startproject ArticleSpider
4. 进入ArticleSpider工程目录并使用模板创建爬虫
cd ArticleSpider
scrapy genspider jobbole blog.jobbole.com
注: scrapy genspider <爬虫名> <爬取的主域名>
5. 导入PyCharm并修改settngs.py
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
注: 将不会检测域名是否符合Robots协议,意味着不会过滤域名
1. 编写debug测试入口
为了能够在PyCharm中运行并进行debug,在工程下创建main.py作为程序启动入口
添加如下代码:
from scrapy.cmdline import execute
import sys
import os
sys.path.append(os.path.abspath(__file__))
execute(['scrapy', 'crawl', 'jobbole'])
注: 添加上述测试入口文件后,在main.py中右键debug,则可以debug测试爬虫。如果爬虫名不同则将jobbole替换成自己的爬虫名即可。
2. 进入爬虫文件修改需要爬取的主页面URL
class JobboleSpider(scrapy.Spider):
name = 'jobbole'
allowed_domains = ['blog.jobbole.com']
start_urls = ['http://blog.jobbole.com/all-posts/']
注: 修改start_urls,则爬虫会从此URL进行爬取工作
3. 在入口函数中进行下一页的循环爬取
def parse(self, response):
#爬取当前页的所有新闻url并交给parse_detail解析
post_urls = response.css('.post-meta a.archive-title::attr(href)').extract()
for post_url in post_urls:
yield Request(parse.urljoin(response.url, post_url), callback=self.parse_detail)
#爬取下一页的url并递归调用当前parse进行解析
next_href = response.css('.next.page-numbers::attr(href)').extract_first()
if next_href:
yield Request(url=parse.urljoin(response.url, next_href), callback=self.parse)
注:因为爬虫开始执行后会直接执行parse函数,所以在此函数中应编写循环爬取当前页的所有新闻的操作,并交给解析器parse_detail进行解析。当前页爬取完后,再爬取下一页的url,将下一页再交给parse进行爬取每一条新闻。
4. 编写页面爬取逻辑
def parse_detail(self, response):
# 页面爬取逻辑
title = response.css('.entry-header h1::text').extract_first().strip()
pass
注: response.css()是将下载器下载的每一个url页面,使用css语法进行过滤从而得到需要的内容。使用浏览器的开发者工具进行获取要选择的元素,并获取其样式。.extract()是获取当前元素的内容,因为形式是一个数组,所以可以[0]来获取第一个元素或者直接extract_first()获取第一个元素内容,strip()是去掉前后空格。