一、安装Scrapy爬虫框架

pip install Scrapy

验证安装,命令行输入scrapy

安装成功

image-20220206141705406

安装失败

zsh: command not found: scrapy

二、初始化爬虫项目

Scrapy命令表

1、创建爬虫文件

scrapy startproject 项目名

示例:

scrapy startproject Content

创建成功

image-20220206143714695

You can start your first spider with:
    cd Content
    scrapy genspider example example.com

按照提示完成:

1、进入爬虫目录
cd Content
2、创建一个爬虫

创建basic爬虫

scrapy genspider 爬虫名 域名

或者创建crawl爬虫

crawlspider使用起来更加的方便,推荐使用

scrapy genspider -t crawl 爬虫名 域名

示例1:

scrapy genspider contentSpider douban.com

Created spider 'contentSpider' using template 'basic' in module:
Content.spiders.contentSpider

示例2:

scrapy genspider -t crawl contentSpider douban.com

Created spider 'contentSpider' using template 'crawl' in module:
Content.spiders.contentSpider

我们这里按照示例2创建一个crawlspider

创建完成后文件目录如下图所示:

image-20220206145559300

2、爬虫配置

1、修改爬虫设置settings.py

"""
    爬虫设置
"""
from sqlalchemy import false
BOT_NAME = 'Content'
SPIDER_MODULES = ['Content.spiders']
NEWSPIDER_MODULE = 'Content.spiders'
"""以上内容请替换成自己 settings.py 文件中的内容"""

LOG_LEVEL = 'ERROR' # 日志显示内容设置为只显示错误日志(非必要)

CLOSESPIDER_ITEMCOUNT = 1000 # 设置爬虫爬取数量

DOWNLOAD_TIMEOUT = 1 # 超时响应时间

ROBOTSTXT_OBEY = False #是否遵守爬虫协议

CONCURRENT_REQUESTS = 32 # 爬虫最大并发数

COOKIES_ENABLED = False # 禁止cookies

#自定义协议头只接受文本类型文件
DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/*;q=0.9',
  'Accept-Language':'zh-CN,zh;q=0.8',
  'USER_AGENT':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
}

# 打开ITEM管道
ITEM_PIPELINES = {
   'Spider.pipelines.SpiderPipeline': 300,
}

2、修改项目文件items.py

import scrapy


class ContentItem(scrapy.Item):
    fileNo = scrapy.Field() # 文档编号
    link = scrapy.Field() # 网页链接
    title = scrapy.Field()# 网页标题
    content = scrapy.Field() # 网页正文
    aLink = scrapy.Field() # 网页子链接

scrapy.Field() 不用修改,fileNo、link...修改为你想爬虫的内容

3、修改管道文件pipelines.py


from itemadapter import ItemAdapter

class ContentPipeline:

    # 初始化爬虫时会执行
    def __init__(self):
        pass

    # 爬虫数据通过管道传入时会执行
    def process_item(self, item, spider):
        fileNo = item['fileno']
        # 将爬虫爬取的数据保存到文件中
        with open('{0}.txt}'.format(fileNo),'w',encoding='utf-8') as fp:
            fp.write(item['link']+'\n')
            fp.write(item['title']+'\n')
            fp.write(item['content']+'\n')
            for link in item['aLink']:
                fp.write(link+'\n')
        return item

    # 关闭爬虫时会执行
    def close_spider(self,spider):
        pass

4、修改爬虫文件(spiders文件夹下的文件)

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
import re


class ContentspiderSpider(CrawlSpider):
    name = 'contentSpider'
    allowed_domains = ['douban.com']
    start_urls = ['http://douban.com/']
    url_sum = 1
    """
    爬虫 Rule(LinkExtractor(allow=r'Items/')
    其中 allow=r'Items/' 为爬虫链接提取规则
    如果想要爬虫所有子链接则设置为 allow=r''
    """
    rules = (
        Rule(LinkExtractor(allow=r''), callback='parse_item', follow=True),
    )
    Alink = LinkExtractor(allow=r'', unique=True) # 使用链接链接提取器提取子链接

    # 数据内容解析
    def parse_item(self, response):
        item = {}
        item['link'] = response.url  # 提取网页链接
        item['fileNo'] = self.url_sum  # 文档编号
        item['content'] = extract_text(response.text)  # 提取正文数据
        title = response.xpath("//head/title/text()").extract_first()  # 提取正文标题
        # 提取子链接
        alink = ""
        for link in self.Alink.extract_links(response):
            alink += link.url+' '
        item['Alink'] = alink
        if title == None:
            item['title'] = '无标题'
        else:
            item['title'] = title
        print(self.url_sum)
        self.url_sum += 1
        return item


# 提取网页中的正文,保留文本信息
def extract_text(content):
    content = filter_emoji(string=content, restr='')
    s = remove_empty_line(remove_js_css(content))
    s = remove_any_tag(s)
    s = remove_empty_line(s)
    return s


# 移除content中的空行以及英文字母
def remove_empty_line(content):
    r = re.compile(r'''^\s+$''', re.M | re.S)
    s = r.sub('', content)
    r = re.compile(r'''\n+''', re.M | re.S)
    s = r.sub('\n', s)
    return s


# 移除content中的script、style、meta、注释等脚本
def remove_js_css(content):
    r = re.compile(r'''<script.*?</script>''', re.I | re.M | re.S)
    s = r.sub('', content)
    r = re.compile(r'''<style.*?</style>''', re.I | re.M | re.S)
    s = r.sub('', s)
    r = re.compile(r'''<!--.*?-->''', re.I | re.M | re.S)
    s = r.sub('', s)
    r = re.compile(r'''<meta.*?>''', re.I | re.M | re.S)
    s = r.sub('', s)
    r = re.compile(r'''<ins.*?</ins>''', re.I | re.M | re.S)
    s = r.sub('', s)
    return s


# 移除content中的js、css等脚本
def remove_any_tag(s):
    s = re.sub(r'''<[^>]+>''', '', s)
    return s.strip()

 # 过滤表情
def filter_emoji(string, restr=''):
    try:
        co = re.compile(u'[\U00010000-\U0010ffff]')
    except re.error:
        co = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
    return co.sub(restr, string)

3、运行爬虫

scrapy crawl contentSpider

爬虫源代码:

此处内容需要评论回复后(审核通过)方可阅读。

最后修改:2022 年 02 月 12 日
如果觉得我的文章对你有用,请随意赞赏