Scrapy 爬取QQ新闻

scrapy框架是Python爬虫框架中运用的最广的框架,最近闲来无事,研究了一下。因本人爱好军事,所以写了个爬取QQ军事新闻网的爬虫。

本人非常喜欢python 这门语言,python有这丰富的库,安装/卸载库也非常简单
pip install xxx ,卸载 pip uninstall xxx,言归正传。
scrapy 官网网址:
http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/install.html
第一步我们安装一下scrapy:

    pip install scrapy 

scrapy -h 看一下scrapy基本的命令


第二步我们创建一个tutorial项目

    scrapy startproject tutorial

查看一下创建好的目录结构
Scrapy 爬取QQ新闻_第1张图片
这些文件分别是:
scrapy.cfg: 项目的配置文件
tutorial/: 该项目的python模块。之后您将在此加入代码。
tutorial/items.py: 项目中的item文件.
tutorial/pipelines.py: 项目中的pipelines文件.
tutorial/settings.py: 项目的设置文件.
tutorial/spiders/: 放置spider代码的目录.


第三步我们在tutorial/items.py添加如下内容:
```

    import scrapy
    from scrapy.item import Item, Field
    class QQNews(scrapy.Item):
        title = Field()
        content = Field()

```
Item 是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。简单点就是我们存储爬取到的数据的字段。


第四步,我们编写爬虫脚本
vim tutorial/spiders/qqNewsSpider.py


# -*-coding: utf-8 -*-  
#author:Smile
#data:2018-01-10
#description:this program just to get qq news,we'll get the news title and content
import sys, os  
reload(sys) 

from scrapy.spider import Spider  
from tutorial.items import QQNews
from scrapy.http import Request
from scrapy.selector import Selector

class QQNewsSpider(Spider):
    name = 'qq_news'
    allow_domain = 'http://new.qq.com/'
    start_urls= ["http://mil.qq.com/mil_index.htm"]

    def parse(self,response):
        news_urls = Selector(response)
        for start_url in news_urls.xpath('//a[@class=\"pic\"]/@href').extract():
            yield Request(url="http:"+start_url,callback=self.second_parse) 

    def second_parse(self,response):
        detail_sel = Selector(response)
        content = ""
        item = QQNews()
        item['title'] =  detail_sel.xpath('//div[@class=\"LEFT\"]/h1/text()').extract()
        item['content'] = ''.join(detail_sel.xpath('//div[@class=\"content-article\"]/p/text()').extract())

        yield item

第五步对数据进行处理,我是直接写txt文档的
修改 tutorial/pipelines.py


from scrapy import signals  
import json  
import codecs  
import sys  
reload(sys)  
sys.setdefaultencoding("utf-8")

class QQNewsPipeline(object):
    def process_item(self, item, spider):
        if not item['title']:
            return item
        file_name = item['title'][0] + ".txt"
        fp = open("/Users/admin/Desktop/data/"+file_name, 'w')  
        fp.write(item['content'])  
        fp.close()

        return item

第六步,修改配置文件


    BOT_NAME = 'tutorial'
    SPIDER_MODULES = ['tutorial.spiders']
    NEWSPIDER_MODULE = 'tutorial.spiders'
    LOG_LEVEL = 'INFO' 
    ROBOTSTXT_OBEY = True

最后一步,也是最牛逼的一步运行脚本

    scrapy crawl qq_news

Scrapy 爬取QQ新闻_第2张图片

你可能感兴趣的:(爬虫)