这次是使用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就可以在这里面显示啦