学python也没两天,看了点基础就直接来搞爬虫了,然后就接触了Scrapy框架
以下是度娘说的
Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
emmm…废话不多说,先介绍下Scrapy吧
ScrapyEngine:这是scrapy框架的核心,处理整个系统的数据流
Scheduler:用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回.
Downloader:用于下载网页内容, 并将网页内容返回
Spiders:爬虫。。
Pipeline:项目管道,处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
Downloader Middlewares:位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
Spider Middlewares:爬虫中间件,处理爬虫的响应输入和请求输出。
Scheduler Middewares:调度中间件,介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
直接实战吧,把我自己的博客列表也就是这个网站https://blog.youkuaiyun.com/zFighter,爬出来,后面的内容什么的以后再添加,先通过这个简单的实例了解一下这个框架吧
1.安装scrapy
pip install scrapy
2.创建工程
scrapy startproject myprojectname
3.用IDEA打开这个项目,要注意,Scrapy默认是不能在IDE中调试的,我们在根目录中新建一个py文件叫:entrypoint.py;在里面写入以下内容:
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'spider_name'])
这个spider_name就是一会要创建的spider的name,下面会讲到
4.设置数据存储模板
items.py
class Blog(scrapy.Item):
# 地址
blogUrl = scrapy.Field()
# 标题
blogTitle = scrapy.Field()
# 作者
author = scrapy.Field()
# 摘要
blogAbstract = scrapy.Field()
注意一定要继承scrapy.Item 一定要继承scrapy.Item 一定要继承scrapy.Item
5.在spiders文件夹中编写自己的爬虫
新建csdn_spider.py
import scrapy
from scrapy.http import Request
from bs4 import BeautifulSoup
from tutorial.items import Blog
class Csdn(scrapy.spiders.Spider):
name = "csdn"
allowed_domains = ['youkuaiyun.com']
bashurl = 'https://blog.youkuaiyun.com/zFighter'
def start_requests(self):
yield Request('https://blog.youkuaiyun.com/zFighter', self.parse)
def parse(self, response):
# 获取文章列表
uls = BeautifulSoup(response.text, 'lxml').find_all('div',
{'class': 'article-item-box csdn-tracking-statistics'})
for ul in uls:
blog_name = ul.find('h4', {'class', 'text-truncate'}).find('a').get_text().strip()
blog_url = ul.find('a')['href']
blogAbstract = ul.find('p', {'class': 'content'}).find('a').get_text().strip()
author = 'zhj'
item = Blog()
item['blogUrl'] = str(blog_url).replace('\xa0', '')
item['blogTitle'] = str(blog_name).replace('\n', '')
item['blogAbstract'] = str(blogAbstract).replace('/', '')
item['author'] = str(author).replace('/', '')
yield item
6.编写piperlines
from tutorial.items import Blog
class DmozItemPipeline(object):
def process_item(self, item, spider):
if isinstance(item,Blog):
blogUrl=item['blogUrl']
ret = Sql.selectBlogbyUrl(blogUrl)
if ret[0] == 1:
print('已经存在了')
pass
else:
blogTitle=item['blogTitle']
author=item['author']
blogAbstract=item['blogAbstract']
Sql.insert_blog(blogUrl,blogTitle,blogAbstract,author)
print('文章存储完毕')
7.在settings中添加
ITEM_PIPELINES = {
‘tutorial.mysqlpipelines.pipelines.DmozItemPipeline’: 1
}
8.编写sql.py
import mysql.connector
from tutorial import settings
MYSQL_HOSTS = settings.MYSQL_HOSTS
MYSQL_USER = settings.MYSQL_USER
MYSQL_PASSWORD = settings.MYSQL_PASSWORD
MYSQL_PORT = settings.MYSQL_PORT
MYSQL_DB = settings.MYSQL_DB
cnx = mysql.connector.connect(user=MYSQL_USER, password=MYSQL_PASSWORD, host=MYSQL_HOSTS, database=MYSQL_DB)
cur = cnx.cursor(buffered=True)
class Sql:
@classmethod
def insert_blog(cls,blogUrl,blogTitle,blogAbstract,author):
# sql="INSERT INTO blog (`blogUrl`,`blogTitle`,`author`,`blogAbstract`) VALUES (%(blogUrl)s,%(blogTitle)s,%(author)s,%(blogAbstract)s)"
sql="INSERT INTO blog (`blogUrl`,`blogTitle`,`author`,`blogAbstract`) VALUES (%s,%s,%s,%s)"
value={
'blogUrl':blogUrl,
'blogTitle':blogTitle,
'blogAbstract':blogAbstract,
'author':author
}
try:
cur.execute(sql,(blogUrl,blogTitle,blogAbstract,author))
cnx.commit()
except Exception as e:
print(Exception,":",e)
当然别忘了在settings中配置一下mysql啊
MYSQL_HOSTS = '127.0.0.1'
MYSQL_USER = 'root'
MYSQL_PASSWORD = 'root'
MYSQL_PORT = '3306'
MYSQL_DB = 'python'
建表的过程就不赘述了
看运行效果
当然还有很多功能没有实现,比如还没有爬内容和图片,还有分页的查询,这里的分页是js动态的,后面会继续更新的
附上github地址
https://github.com/Confidenceme/tutorial