1.目标
- 伯乐在线网站地址:http://blog.jobbole.com/all-posts/
- 爬取伯乐在线的所有文章信息,包括图片网址,标题,发表日期,标签,点赞数,评论数等
- 将爬取的数据保存至数据库(同步,异步两种方式)
2.环境需求
- python 3.6
- MySQL
- scrapy 1.5
3.思路分析
-
对列表页抓取文章网址和封面图片的网址,并获取下一页网址进行解析;
-
抓取文章的信息,保存至数据库;
4.实战演练
4.1创建爬虫项目
#cmd 中创建爬虫项目
scrapy startproject jobbole
#创建我们的spider
cd jobbole
scrapy genspider blogjobbole blog.jobbole.com #默认为basic模板
打开blogjobbole.py
查看已经有创建³³³³好的模板代码:
# -*- coding: utf-8 -*-
import scrapy
class Blogjobbole(scrapy.Spider):
name = "blogjobbole"
allowed_domains = ["blog.jobbole.com"]
# start_urls是一个待爬的列表,
#spider会为我们下载请求网页,随后进入到parse阶段
start_urls = ['http://blog.jobbole.com/']
def parse(self, response):
pass
由于我们爬取的起始网址是http://blog.jobbole.com/all-posts/ ,因此需要对start_urls
进行修正,爬虫将从这个页面开始爬取。
start_urls = ['http://blog.jobbole.com/all-posts/']
注意点: scrapy默认遵守网站协议,由于我们爬取网站可能是禁止爬虫的,因此需要配置的修改,setting.py
的设置不遵守重启协议。
ROBOTSTXT_OBEY = False #将True改为False
4.2解析列表页获取网址
from scrapy import Request
def parse(self, response):
"""
1. 获取文章列表页中的文章url并交给scrapy下载后并进行解析
2. 获取下一页的url并交给scrapy进行下载, 下载完成后交给parse
"""
# 解析列表页中的所有文章url并交给scrapy下载后并进行解析
post_nodes = response.css("#archive .floated-thumb .post-thumb a")
for post_node in post_nodes:
image_url = post_node.css("img::attr(src)").extract_first("")
post_url = post_node.css("::attr(href)").extract_first("")
yield Request(url=parse.urljoin(response.url, post_url), meta={"front_image_url": image_url},#meta:在下载网页的时候把获取到的封面图的url传给parse_detail的response
callback=self.parse_detail)
# 提取下一页并交给scrapy进行下载
next_url = response.css(".next.page-numbers::attr(href)").extract_first("")
if next_url:
yield Request(url=parse.urljoin(response.url, next_url), callback=self.parse)
解析拼接网址应对HERF内有可能网址不全
from urllib import parse
url=parse.urljoin(response.url,post_url)
parse.urljoin("http://blog.jobbole.com/all-posts/","http://blog.jobbole.com/111535/")
#结果为http://blog.jobbole.com/111535/
我们可以提供一个 base_url
(基础链接)作为第一个参数,