scrapy | 爬取伯乐在线全部博文(xpath/css/itemload三种提取方法,同步、异步方式存入MySQL)

1.目标

  • 伯乐在线网站地址:http://blog.jobbole.com/all-posts/
  • 爬取伯乐在线的所有文章信息,包括图片网址,标题,发表日期,标签,点赞数,评论数等
  • 将爬取的数据保存至数据库(同步,异步两种方式)

2.环境需求

  1. python 3.6
  2. MySQL
  3. scrapy 1.5

3.思路分析

  1. 对列表页抓取文章网址和封面图片的网址,并获取下一页网址进行解析;

  2. 抓取文章的信息,保存至数据库;

    爬取逻辑分析
    爬取逻辑分析

     

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/

我们可以提供一个 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值