环境
win8, python3.7, pycharm
正文
1.Scrapy框架的安装
在cmd命令行窗口执行:
pip install Scrapy
即可完成Scrapy框架的安装
2. 创建Scrapy项目
在cmd命令行窗口下切换到想要的目录下, 我这里是C:\Users\Administrator\PycharmProjects\untitled\Tests\Scrapy
执行下面代码, 即可在当前的"Scrapy"目录下生成JianShu项目文件夹.
scrapy startproject JianShu
文件夹结构如下:
items.py:定义要爬取的项目
middlewares.py: 定义爬取时的中间介质
pipelines.py: 定义数据管道
settings.py: 配置文件
scrapy.cfg: Scrapy部署时的配置文件
3. 创建JianShuSpider
在cmd命令行依次执行以下代码, 即可在"JianShu/spiders"目录下创建JianShuSpider.py文件
cd JianShu
scrapy genspider JianShuSpider JianShuSpider.toscrape.com
4. 定义要爬取的项目
在items.py中确定要爬取的信息: 简书热门专题中的主题, 内容, 文章数, 粉丝数这四个信息
1 importscrapy2 from scrapy.item importItem, Field3
4 classJianshuItem(Item):5 #define the fields for your item here like:
6 #name = scrapy.Field()
7 title = Field() #主题
8 content = Field() #内容
9 article = Field() #文章
10 fans = Field() #粉丝
5. 编写爬虫主程序
简书热门专题采用异步加载, 在NetWork中选择XHR来确定异步加载的url: https://www.jianshu.com/recommendations/collections?page=(1,2,3,4.....)&order_by=hot
在JianShuSpider.py中编写主程序:
1 importscrapy2 from scrapy.spiders importCrawlSpider3 from scrapy.selector importSelector4 from JianShu.items importJianshuItem5 from scrapy.http importRequest6 classJianShu(CrawlSpider):7 name = 'JianShu'
8 allowed_domains = ['JianShuSpider.toscrape.com']9 start_urls = ['https://www.jianshu.com/recommendations/collections?page=1&order_by=hot']10 defparse(self, response):11 item =JianshuItem()12 #对源码进行初始化
13 selector =Selector(response)14 #采用xpath进行解析
15 infos = selector.xpath('//div[@class="collection-wrap"]')16 for info ininfos:17 title = info.xpath('a[1]/h4/text()').extract()[0]18 content = info.xpath('a[1]/p/text()').extract()19 article = info.xpath('div/a/text()').extract()[0]20 fans = info.xpath('div/text()').extract()[0]21 #加入判断, 如果content存在则返回content[0], 否则返回''
22 ifcontent:23 content =content[0]24 else:25 content = ''
26 item['title'] =title27 item['content'] =content28 item['article'] =article29 item['fans'] =fans30 yielditem31 #列表生成式, 生成多个url
32 urls = ['https://www.jianshu.com/recommendations/collections?page={0}&order_by=hot'.format(str(page)) for page in range(2,37)]33 for url inurls:34 yield Request(url,callback=self.parse)
6. 保存到MongoDB
利用pipelines数据管道将其存储至MongoDB, 在pipelines.py编写:
1 importpymongo2
3 classJianshuPipeline(object):4 def __init__(self):5 '''连接Mongodb'''
6 client = pymongo.MongoClient(host='localhost')7 db = client['test']8 jianshu = db["jianshu"]9 self.post =jianshu10 defprocess_item(self, item, spider):11 '''写入Mongodb'''
12 info =dict(item)13 self.post.insert(info)14 return item
7. setting配置
1 BOT_NAME = 'JianShu'
2 SPIDER_MODULES = ['JianShu.spiders']3 NEWSPIDER_MODULE = 'JianShu.spiders'
4 #从网站请求头复制粘贴User-Agent
5 USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
6 ROBOTSTXT_OBEY =True7 #设置等待时间5秒
8 DOWNLOAD_DELAY = 5
9 #配置项目管道
10 ITEM_PIPELINES ={11 'JianShu.pipelines.JianshuPipeline': 300,12 }
8. 新建main.py文件
在JianShu文件目录下新建main.py文件, 编辑如下代码:
1 from scrapy importcmdline2 cmdline.execute('scrapy crawl JianShu'.split())
9. 运行main.py文件
在运行之前, 需确保mongodb服务已经启动, 执行结果如下: