一、本文主要用到的工具。
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,有待改进。