利用python scrapy抓取csdn的文章

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/k331922164/article/details/87859069

一、本文主要用到的工具。

1、sogou浏览器

2、pycharm 2018.2.3

3、scrapy 1.6.0

二、设置scrapy。

在settings.py中设置以下参数:

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 0.5
ITEM_PIPELINES = {
   'scrapy.pipelines.images.ImagesPipeline': 300,
}
IMAGES_STORE = 'C:\WorkDir\ProPython\example\example\download'

设置USER_AGENT,可以把scrapy伪装成sogou浏览器。需要查询浏览器的UA可以在查询网中得到。

ROBOTSTXT_OBEY设置为False可以抓取任意页面。

DOWNLOAD_DELAY设置下载页面的延时,进一步伪装。

ITEM_PIPELINES打开图像处理包。

IMAGES_STORE图片保存的路径。

三、编写爬虫代码。

修改pipeline.py,代码如下:

from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem
from scrapy.http import Request

class MyImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        for image_url in item['image_urls']:
            yield Request(image_url)

    def item_completed(self, results, item, info):
        image_path = [x['path'] for ok, x in results if ok]
        if not image_path:
            raise DropItem('Item contains no images')
        item['image_paths'] = image_path
        return item

新建一个csdn.py,代码如下:

# -*- coding: utf-8 -*-
# scrapy crawl csdn -o csdn.csv --nolog
import scrapy
class CsdnSpider(scrapy.Spider):
    name = "csdn"
    start_urls = ['https://blog.csdn.net/k331922164/article/details/86251743']

    def parse(self, response):
            item = {}
            item['image_urls'] = []
            for article in response.xpath('//*[@id="mainBox"]/main/div[1]/div/div/div[1]'):
                title = article.xpath('./h1/text()').extract_first()
            for article in response.xpath('//*[@id="content_views"]'):
                contentlist = article.xpath('./p//text()').extract()
                content = ''.join(contentlist)
            yield {
                'title': title,
                'content': content,
            }
            for src in response.xpath('//div[@class="blog-content-box"]'):
                item['image_urls'] = src.xpath('.//img/@src').extract()
            yield item

            for next_article in response.xpath('//li[@class="widescreen-hide"]'):
                next_url = next_article.xpath('./a/@href').extract_first()
                if next_url:
                    yield scrapy.Request(next_url, callback=self.parse)
                    break

使用指令scrapy crawl csdn -o csdn.csv --nolog,可以抓取本博客的文章。

原理如下:

先打开最新的一篇文章,作为start_url。

利用上一篇中的链接作为next_url。

对感兴趣的部分右击,审查元素,可以看到对应的web源码。

对源码右击,可以copy到对应的xpath,视情况修改xpath即可使用。

最终把所有文章保存到csv中。

图片都在download/full目录中。

四、其它问题。

1、运行scrapy时,可能出现缺少模块。可以自己安装pillow-PIL,pywin32等。

2、该脚本不能把文章转换成PDF、WORD,有待改进。

猜你喜欢

转载自blog.csdn.net/k331922164/article/details/87859069