伯乐在线爬虫项目目的及项目准备:

1.使用scrapy创建项目

2.创建爬虫,bole 域名 jobbole.com

3.Start_urls = [‘http://blog.jobbole.com/all-posts/’]

4.爬取所有页数的文章

5.文章列表页需要数据

a) 缩略图的地址

b) 详情url地址

6.详情页面要提取的数据

# 博客标题

    # 博客创建时间

    # 博客url

    # 将url经过md5加密生成id

    # 缩略图的地址

    # 图片保存路径  #这个属性考虑好在哪赋值

    # 点赞数

    # 收藏数

    # 评论数

    # 博客作者

# 博客标签

7.将图片下载,保存到imgs文件夹中

8.将爬取的所有数据存储到数据库

创建项目我们在cmd中进行创建,在开始之前我们要将数据库表以及其中字段创建好。


spider爬虫代码:

# -*- coding: utf-8 -*-
import scrapy
import re
# ..上级目录
from ..items import BoleItem
# .同级目录
from .tools import get_number,md5
# MVC  Model view controler
# 降低代码耦合性
# MVVC# 做url地址的拼接,如果没有域名才会进行拼接
import urlparse
class BoleSpider(scrapy.Spider):name = 'bole'allowed_domains = ['jobbole.com']start_urls = ['http://blog.jobbole.com/all-posts/']def parse(self, response):# 获取每一页的文章url和图片urla_list = response.xpath(".//*[@id='archive']/div/div[1]/a")for a in a_list:# 获取博客详情页面url# 获取博客图片的urla_href = a.xpath("@href").extract_first('')img_src = a.xpath("img/@src").extract_first('')yield scrapy.Request(url=a_href,callback=self.parse_detail,meta={"img_src":img_src})next_page = response.xpath("//a[@class='next page-numbers']/@href").extract_first('')if next_page:# 发送请求,请求下一页yield scrapy.Request(url=next_page)def parse_detail(self,response):# 博客详情地址blog_url = response.url# 图片url地址img_src = response.meta["img_src"]# 图片地址有可能不完整if img_src:# 1.拼接URL地址img_src = urlparse.urljoin('http://www.jobbole.com',img_src)else:img_src = ''# 博客标题title = response.xpath("//div[@class='entry-header']/h1/text()").extract_first('')# 博客发布时间blog_date = response.xpath("//p[@class='entry-meta-hide-on-mobile']/text()").extract_first('').strip().replace(u'·','').strip()# 所有的标签tags = response.xpath("//p[@class='entry-meta-hide-on-mobile']/a/text()").extract()# join 将列表中所有的字符串拼接,并以,隔开# split 将字符串根据某个字符进行分割,返回一个列表tags = ','.join(tags)# 点赞数like_count = response.xpath("//h10/text()").extract_first('')# 没有点赞设置为0if like_count:like_count = int(like_count)else:like_count = 0# 评论数comment_count = response.xpath("//a[@href='#article-comment']/span/text()").extract_first('')comment_count = get_number(comment_count)# 收藏数bookmark_count = response.xpath("//span[contains(@class,'bookmark-btn')]/text()").extract_first('')bookmark_count = get_number(bookmark_count)# blog_id# img_path# 创建Item对象item = BoleItem()item['blog_id'] = md5(response.url)item["title"] = titleitem["blog_url"] = blog_url# 将图片url放在列表中item["img_src"] = [img_src]item["blog_date"] = blog_dateitem["tags"] = tagsitem["like_count"] = like_countitem["comment_count"] = comment_countitem["bookmark_count"] = bookmark_countprint title,blog_date,blog_url,img_src,like_count,comment_count,bookmark_count,tagsyield item 

创建工具包tools,优化代码,工具包tools代码:
设置随机请求头,设置middlewares中内容代码如下: 
在item中创建数据模型类
# 设置随机请求头
from fake_useragent import UserAgent
class RandomUAMiddleware(object):def __init__(self,crawler):super(RandomUAMiddleware, self).__init__()self.crawler = crawlerself.ua = UserAgent()@classmethoddef from_crawler(cls,crawler):return cls(crawler)# 处理请求函数def process_request(self,request,spider):# 随机产生请求头request.headers.setdefault('User-Agent',self.ua.random)
import hashlib
# md5加密函数
def md5(str):import hashlibm = hashlib.md5()m.update(str)return m.hexdigest()# 只要以后需要从字符串中匹配数字,就可以使用这个函数
import re
def get_number(str):# 正则pattern = re.compile(r'\d+')rs = re.search(pattern, str)if rs:count = int(rs.group())else:count = 0return count
 
class BoleItem(scrapy.Item):title = scrapy.Field()blog_url = scrapy.Field()img_src = scrapy.Field()blog_date = scrapy.Field()tags = scrapy.Field()like_count = scrapy.Field()comment_count = scrapy.Field()bookmark_count = scrapy.Field()img_path = scrapy.Field()blog_id = scrapy.Field()

写入数据库,我们使用异步写入,首先在setting文件中自己配置一些项目信息

# 数据库配置
MYSQL_HOST = '127.0.0.1'
MYSQL_PORT = 3306
MYSQL_USER = 'root'
MYSQL_PASSWD = '123456'
MYSQL_CHARSET = 'utf8'
MYSQL_DBNAME = 'jobbole'

然后设置pipelines,其中包含了我们写入数据库的代码,和下载图片的代码代码如下:
from scrapy.http.request import  Request
class MyImagePipeline(ImagesPipeline):# 把当前的item处理完成之后,执行这个函数def item_completed(self, results, item, info):# 首先判断要下载的图片是否有完成信息if results:try:# 检测有有没有图片信息字典# 先取出列表中的元组,再从元组中取出字典img_dic = results[0][1]img_path = img_dic["path"]except Exception,e:print '------',eimg_path = '没有图片路径'else:img_path = '没有图片信息'# 对item的img_path赋值item["img_path"] = 'imgs/'+img_path# 返回itemreturn item# 当需要处理媒体文件时,会执行该函数def get_media_requests(self, item, info):# 获取图片的url地址for src in item['img_src']:return Request(url=src,meta={'item':item})# return [Request(x) for x in item["img_src"], []]# 指定图片存放的路径def file_path(self, request, response=None, info=None):# 取出itemitem = request.meta["item"]# 取出图片urlimg_name = request.url.split('/')[-1]return img_name# 异步写入数据库
from twisted.enterprise import adbapi
from MySQLdb import cursorsclass MysqlTwistedPipeline(object):@classmethod# 这个函数会自动调用def from_settings(cls,settings):# 准备好连接数据库需要的参数db_params = dict(# 复制当前行Ctrl + dhost = settings["MYSQL_HOST"],port = settings["MYSQL_PORT"],user = settings["MYSQL_USER"],passwd = settings["MYSQL_PASSWD"],charset = settings["MYSQL_CHARSET"],db = settings["MYSQL_DBNAME"],use_unicode = True,# 指定游标类型cursorclass=cursors.DictCursor)# 创建连接池# 1.要连接的名称  2.连接需要的参数db_pool = adbapi.ConnectionPool('MySQLdb',**db_params)# 返回当前类的对象,并且把db_pool赋值给该类的对象return cls(db_pool)def __init__(self,db_pool):# 赋值self.db_pool = db_pool# 处理item函数def process_item(self,item,spider):# 把要处理的事件进行异步处理# 1.要处理的事件函数# 2.事件函数需要的参数query = self.db_pool.runInteraction(self.do_insert,item)# 执行sql出现错误信息query.addErrback(self.handle_error,item,spider)# 错误的原因def handle_error(self,failure,item,spider):print failure# 处理插入数据库的操作# cursor该函数是连接数据库的函数,并且放在异步去执行,cursor执行sql语句def do_insert(self,cursor,item):# 1.准备sql语句sql = 'insert into bolejb(title,blog_url,img_src,blog_date,tags,like_count,comment_count,bookmark_count,img_path,blog_id)VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'# 2.用cursor游标执行sqlcursor.execute(sql, (item["title"], item["blog_url"], item["img_src"][0], item["blog_date"], item["tags"], item["like_count"],item["comment_count"], item["bookmark_count"], item["img_path"],item["blog_id"]))最后我们需要设置我们setting文件中的内容,将我们重写的中间件在setting中进一步设置DOWNLOADER_MIDDLEWARES = {'BoleSpider.middlewares.RandomUAMiddleware': 1,
}ITEM_PIPELINES = {'BoleSpider.pipelines.MyImagePipeline': 1,'BoleSpider.pipelines.MysqlTwistedPipeline': 2,
}
# 根据哪个属性下载图片
IMAGES_URLS_FIELD = 'img_src'
IMAGES_STORE = 'imgs'为了方便调试,我们可以创建一个debug文件from scrapy.cmdline import execute
execute(['scrapy','crawl','bole'])
												

Python scrapy爬虫爬取伯乐在线全部文章,并写入数据库相关推荐

  1. scrapy简单入门 - 爬取伯乐在线所有文章

    推荐我的个人博客 http://blog.wuzhenyu.com.cn scrapy 是一个用 python 语言编写的,为了爬取网站数据,提取结构性数据而编写的应用框架. 环境 本文使用的环境: ...

  2. Scrapy爬取伯乐在线所有文章

    Scrapy爬取伯乐在线所有文章 1.目标分析 2.Spiders的编写 2.1.网站结构分析 2.2.获取当页文章URL 2.3.获取文章的信息 2.4.文章列表下一页 2.4.编写spiders. ...

  3. Python Scrapy 爬虫 - 爬取多级别的页面

    Python Scrapy 爬虫 - 爬取多级别的页面 互联网中众多的 scrapy 教程模板,都是爬取 下一页 → \rightarrow →下一页形式的,很少有 父级 → \rightarrow ...

  4. Python爬虫爬取伯乐在线

    一.环境搭建 1.创建环境 执行pip install scrapy安装scrapy 使用scrapy startproject ArticleSpider创建scrapy项目 使用pycharm导入 ...

  5. Python爬虫爬取伯乐在线网站信息

    一.环境搭建 1.创建环境 执行pip install scrapy安装scrapy 使用scrapy startproject ArticleSpider创建scrapy项目 使用pycharm导入 ...

  6. 边学边敲边记之爬虫系列(八):Scrapy系统爬取伯乐在线

    一.前言 上一篇边学边敲边记爬虫系列七给大家仔细讲解了如何用Xpath分类爬取医疗信息网站医疗器材名称和介绍图片,以及三种最常用的存储方法. 本篇是本系列的第八篇了,今天给大家讲讲如何用Scrapy分 ...

  7. scrapy初始第一波——爬取伯乐在线所有文章

    1 前言    要说到爬虫界的明星,当属我们的python,而这得益于我们的爬虫明星框架--scrapy,这就让我们不得不学习它,这几天刚好用它做一些小demo,就将其总结一下,希望能对大家的学习爬虫 ...

  8. 使用scrapy爬取伯乐在线多线程存为MySQL数据库

    在spider文件中的程序为 import scrapy from ..items import BolespiderItemclass BoleSpider(scrapy.Spider):name ...

  9. 利用python+scrapy+mysql爬取虎扑NBA球员数据存入数据库

      大家好,这是我的第一篇博客,写的不好请见谅. 小编是个多年的NBA观众,最近正值季后赛的比赛,闲来无事,突发奇想,想利用刚刚所学的python著名爬虫框架scrapy采集一下全NBA的球员基本信息 ...

最新文章

  1. 单细胞转录组专题研讨会第二期
  2. JavaScript中的执行环境
  3. iOS iOS9下实现app间的跳转
  4. python输出文本和值_python读取文本中数据并转化为DataFrame的实例
  5. 《编码规范和测试方法——C/C++版》作业 ·007——C++引入MySQL给C的API并简单封装
  6. Spring Boot快速注册服务脚本
  7. VoxelNet:End-to-End Learning for Point Cloud Based 3D Object Detection阅读笔记
  8. 22 个免费高质量的电商网站模版
  9. 网上订餐系统开源代码java_基于SSM实现的网上订餐系统【附源码】(毕设)
  10. 列线图、nomogram到底是什么东西?如何实施?如何解读?
  11. 在图像处理中阈值是什么意思?
  12. layui表格时间格式化
  13. matlab 求股票斜率,「matlab 求股票斜率」同花顺斜率抓强势股指标公式
  14. 路由基础(Routing)
  15. 我的世界java能开光追吗_《我的世界》开光追是怎样一种体验
  16. 趋势与新高的实战研究
  17. 土星环年龄很轻?卡西尼号探测船坠毁前传送珍贵数据
  18. python入门(六)——python数据容器
  19. 服务器 微信报警平台,Zabbix实现微信报警
  20. 一文读懂BLOB算法

热门文章

  1. MySQL 表分区 A PRIMARY KEY must include all columns in the table's partitioning function
  2. Teams新功能更新【已发布】Teams PowerShell 命令详解
  3. Lyndon的量化修炼之路——浅谈趋势指标取参方法
  4. 激活函数:Sigmoid,Tanh,Softmax,Swish,Relu系列,GLU+GTU
  5. GF3卫星影像数据处理-PolSAR+ENVI
  6. PCB载流你必须知道的那些事儿
  7. metasploitable靶机 nessus 扫描 tomcat 漏洞复现幽灵猫
  8. 相机分辨率、图片分辨率、像素及图片尺寸关系的思考
  9. 邮件出现延时的本质究竟是什么......
  10. godaddy域名修改解析服务器,GoDaddy域名解析设置(详细图解教程) URL转发