scrapy&爱问知识人

这次是使用scrapy爬取爱问知识人

一、scrapy的简介

  • Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。
  • Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
  • Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类。
  • 是一个为遍历爬行网站、分解获取数据而设计的应用程序框架。

二、创建一个scrapy项目

打开命令行界面,你想在哪个目录,哪个盘符存储,就找到对应的位置执行以下命令:scrapy startproject name
scrapy startproject这里是固定的;后面的name是我们创建的名字,后面我们运行的时候用得到,你需要根据你的情况创建。
我这的name写的是aiwen,所以我创建完后的目录结构是:
在这里插入图片描述

  • scrapy.cfg: 爬虫项目的配置文件
  • _init _ .py:爬虫项目的出事化文件,用来对项目做初始化工作
  • items.py: 爬虫项目的数据容器文件,用来定义要获取的数据
  • pipelines.py: 爬虫项目的管道文件,用来对items中的数据进行进一步的加工(如:存入MySQL数据库)
  • settings.py: 爬虫项目的设置文件,包含了爬虫项目的设置信息
  • middlewares.py: 爬虫项目的中间件文件(可以对请求和响应进行处理)
  • spiders:用这个来制定特定域名或网页的解析规则,编写用于分析response并提取item或额外跟进的URL类

三、编写items文件

根据你要爬取的内容定义爬取字段

# -*- coding: utf-8 -*-~
import scrapy

class AiwenItem(scrapy.Item):
    #问题
    title = scrapy.Field()
    #回答
    content = scrapy.Field()
    pass

四、编写spider文件

在 刚刚上面创建的项目目录aiwen/aiwen/spiders 下创建一个spider文件,名字自己取。我创建的是名字为aiwen_spiders.py的spider文件。
在这里编写你要爬取的东西

  • 1.创建一个类,并继承scrapy的一个子类:scrapy.Spider 或者是其他类型。
  • 2.定义一个名字,name=“xxx” 后面运行的话需要用到;这个名字是唯一的
  • 3.定义需要爬取的网址;
  • 4.继承scrapy的一个方法:start_requests(self),这个方法的作用就是通过上面定义的网址去爬取页面。
# -*- coding: utf-8 -*-
import scrapy
from aiwen.items import AiwenItem
#解决出现的写入错误
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

user_agent = 'xxxxxxxxxxxx'
headers = {'User-Agent': user_agent}

class aiwenSpider(scrapy.Spider):
    name = "aiwen"  #唯一的
    allowed_domains = ['iask.sina.com.cn']
    #要爬取的起始网址
    start_urls = ['https://iask.sina.com.cn/c/74-goodAnswer-1-new.html']
    def parse(self, response):
        #问题的网址
        lianjie = response.xpath('//div[@class="list-body-con current"]/ul/li/div/div[@class="question-title"]/a/@href').extract()
        for url in lianjie:
            url = 'https://iask.sina.com.cn' + url
            yield scrapy.Request(url, callback=self.content,headers=headers)
        #翻页的网址
        all_0 = response.xpath(u'//a[contains(text(),"下一页")]/@href').extract()
        for url_0 in all_0:
            url_0 = 'https://iask.sina.com.cn' + url_0
        yield scrapy.Request(url_0, callback=self.parse,headers=headers)
    def content(self,response):
        item = {}
        all_1 = response.xpath('//p[@class="title-text"]/text()').extract()
        all_2 = response.xpath('//div[@class="new-answer-text answer-info"]/div/pre/text()').extract()
        for title in all_1:
            item['title'] = title
            for content in all_2:
                item['content'] = content
                yield item
 

五、编写piplines.py文件(写入数据库)

# -*- coding: utf-8 -*-
import MySQLdb
class AiwenPipeline(object):
    def process_item(self, item, spider):
        # 写入数据库
        conn = MySQLdb.connect(host='127.0.0.1', user='root', passwd='xxxxx', db='xxxxx', charset='utf8')
        print('连接上了!')
        cur = conn.cursor()
        into = "INSERT INTO aiwen(title,content) VALUES (%s,%s)"
        values = (item['title'], item['content'])
        cur.execute(into, values)
        conn.commit()
        conn.close()
        return item

六、修改settings.py文件

# -*- coding: utf-8 -*-~
BOT_NAME = 'aiwen'
SPIDER_MODULES = ['aiwen.spiders']
NEWSPIDER_MODULE = 'aiwen.spiders'
ITEM_PIPELINES = {'aiwen.pipelines.AiwenPipeline': 300}
ROBOTSTXT_OBEY = True

七、运行

在命令行中输入scrapy crawl name
这里的name是在spider文件中的name的名字,是那个唯一的名字。
如果不想在命令行中输出,可以在创建的项目目录aiwen/aiwen目录下创建一个新的.py文件,里面写入:

#coding=utf-8
from scrapy import cmdline
cmdline.execute("scrapy crawl aiwen".split())

然后在这里run就可以在这里面显示啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值