基于Scrapy爬取伯乐在线网站

news/2024/5/14 15:04:55/文章来源:https://blog.csdn.net/weixin_33835690/article/details/89613668

标题中的英文首字母大写比较规范,但在python实际使用中均为小写。
2018年7月20日笔记
Scrapy官方文档网址:https://doc.scrapy.org/en/latest/topics/selectors.html
网页在chrome浏览器打开,经过谷歌翻译,如下图所示:

图片.png-90.6kB
图片.png-90.6kB

环境

IDE(Intergrated development Environment),集成开发环境为jupyter notebook和Pycharm
操作系统Win10
语言及其版本:python3.6

1.选择器

使用Selector初始化方法实例化对象赋值给response变量。
css和extract这2个方法的使用示例如下:


图片.png-8.2kB
图片.png-8.2kB

.//和//的区别如下图所示,一般来说要使用.//


图片.png-9.3kB
图片.png-9.3kB

xpath和css方法对比,按照标签属性的值来找标签,如下图所示。
图片.png-13kB
图片.png-13kB

2. 伯乐在线网页持久化

2.1 新建爬虫工程

打开cmd或者powershell在其中输入并运行命令,运行结果如下图所示:
新建爬虫工程命令:scrapy startproject BoleSave

图片.png-7.7kB
图片.png-7.7kB

进入爬虫工程目录命令:cd BoleSave,运行结果如下图所示:
图片.png-11.8kB
图片.png-11.8kB

新建爬虫文件命令: scrapy genspider save blog.jobbole.com,运行结果如下图所示:
图片.png-12.8kB
图片.png-12.8kB

2.2 在Pycharm中导入工程

导入工程的按钮位置如下图所示:


图片.png-25.6kB
图片.png-25.6kB

选中工程文件夹,然后点击OK,如下图所示:


图片.png-15.3kB
图片.png-15.3kB

工程文件夹的结构如下图所示:
图片.png-4.8kB
图片.png-4.8kB

2.3 编辑save.py文件

网页持久化只需要编辑爬虫文件就可以,下面是save.py文件的代码。
第21行dirName变量的值可以设置网页文件保存的位置,例如:
dirName = "d:/saveWebPage"将网页文件保存在D盘的saveWebPage文件夹中。
可以根据个人情况进行修改,不建议将其设置为工程所在文件夹,因为可能导致Pycharm卡顿。

# -*- coding: utf-8 -*-
import scrapy
import os
import redef reFind(pattern,sourceStr,nth=1):if len(re.findall(pattern,sourceStr)) >= nth:return re.findall(pattern,sourceStr)[nth-1]else:return 1class SaveSpider(scrapy.Spider):name = 'save'allowed_domains = ['blog.jobbole.com']start_urls = []url_before = "http://blog.jobbole.com/all-posts/page/{}/"for i in range(1,560):start_urls.append(url_before.format(i))def parse(self, response):dirName = "d:/saveWebPage"if not os.path.isdir(dirName):os.mkdir(dirName)url = response.urlpage_id = int(reFind("\d+", url))html = response.textfileName = "%s/%03d.html" % (dirName, page_id)with open(fileName, 'w', encoding="utf-8") as file:file.write(html)print("目录页面第%d页被存放到%s目录中的%03d.html文件中" %(page_id,dirName,page_id))

2.4 运行结果

运行命令:scrapy crawl save,此命令运行时cmd进入的目录必须在爬虫工程内
运行结果如下图所示:

图片.png-42.9kB
图片.png-42.9kB

从上图中可以观察爬虫的开始时间start_time和finish_time相差为17秒,即从网站中持久化559张网页用时17秒。
本文的测试环境是利用电信4G手机USB连接电脑分享网络,测试时间为2018年7月21日。
保存网页文件的文件夹如下图所示:
图片.png-42.7kB
图片.png-42.7kB

3.解析伯乐在线网页

已经将网站上的网页保存为本地html文件,并将559个文件打包为压缩文件。
压缩文件下载链接: https://pan.baidu.com/s/1ZI2zBkxw7z4vaYYQIZsmdQ 密码: qtp3
解析后的数据存到mysql数据库中,需要先创建数据库bole
采用了数据库连接池,异步多线程操作数据库可以提高效率。

3.1新建爬虫工程

创建爬虫工程命令:scrapy startproject BoleParse
进入爬虫工程目录:cd ./BoleParse/
创建爬虫文件命令: scrapy genspider parse blog.jobbole.com

3.2 编辑items.py文件

import scrapy
from scrapy import Fieldclass BolearticleItem(scrapy.Item):id = Field()title = Field()publishTime = Field()category = Field()digest = Field()detailUrl = Field()imgUrl = Field()

3.3 编辑parse.py文件

import scrapy
from ..items import BoleparseItem
import re
import osdef reFind(pattern,sourceStr,nth=1):if len(re.findall(pattern,sourceStr)) >= nth:return re.findall(pattern,sourceStr)[nth-1]else:return 1class ParseSpider(scrapy.Spider):name = 'parse'start_urls = []baseUrl = "file:///%s/saveWebPage/%03d.html"for i in range(560):start_urls.append(baseUrl %(os.getcwd(),i))def parse(self, response):def find(xpath, pNode=response):if len(pNode.xpath(xpath)):return pNode.xpath(xpath).extract()[0]else:return ''article_list = response.xpath("//div[@class='post floated-thumb']")page_id_str = reFind("saveWebPage/(\d+).html", response.url)page_id = int(page_id_str)count = 0for article in article_list:count += 1item = BoleparseItem()item['id'] = (page_id - 1) * 20 + countitem['title'] = find("div[@class='post-meta']/p[1]/a/@title", article)pTagStr = find("div[@class='post-meta']/p", article)item['publishTime'] = re.search("\d+/\d+/\d+", pTagStr).group(0)item['category'] = find("div[@class='post-meta']/p/a[2]/text()", article)item['digest'] = find("div[@class='post-meta']/span/p/text()", article)item['imgUrl'] = find("div[@class='post-thumb']/a/img/@src", article)item['detailUrl'] = find("div[@class='post-meta']/p/a[1]/@href", article)yield item

3.3 编辑pipelines.py文件

使用pymysql库将每一条文章信息item导入mysql数据库
下面一段代码需要修改2处:1.第4行的数据库名;2.第8行的数据库连接密码。
第24行default charset=utf8mb4创建表默认编码为utf8mb4,因为插入字符可能是4个字节编码。
第29、30行if len(item['imgUrl']) >= 200:item.pop('imgUrl')的作用:
防止图片是base64编码长度过大,遇到此类型的值则丢弃此字段。
通过这2个设置,增加了代码的健壮性,能够保证11172条数据都插入到数据库中。

import pymysql
from time import timedef getConn(database ="bole"):args = dict(host = 'localhost',user = 'root',passwd = '... your password',charset = 'utf8mb4',db = database)return pymysql.connect(**args)class BoleparsePipeline(object):startTime = time()conn = getConn()cursor = conn.cursor()drop_sql = "drop table if exists article"cursor.execute(drop_sql)conn.commit()create_sql = "create table article(id int primary key," \"title varchar(200),publishtime varchar(30)," \"category varchar(30),digest text," \"detailUrl varchar(200),imgUrl varchar(200))default charset = utf8mb4;"cursor.execute(create_sql)conn.commit()def process_item(self, item, spider):if len(item['imgUrl']) >= 200:item.pop('imgUrl')fieldStr = ','.join(['`%s`' % k for k in item.keys()])valuesStr = ','.join(['"%s"' % v for v in item.values()])insert_sql = "insert into article(%s) values(%s)" % (fieldStr, valuesStr)self.cursor.execute(insert_sql)self.conn.commit()return itemdef close_spider(self, spider):print("程序总共运行%.2f秒" % (time() - self.startTime))

3.4 编辑settings文件

关键点是最后3行要开启管道,CONCURRENT_REQUESTS变量设置为96能够较好利用多线程性能
CONCURRENT_ITEMS设置为200能够加快并发管道处理item的速度。
ROBOTSTXT_OBEY设置为False,意思是不遵守爬虫协议,也称机器人协议。如果设置为True,即遵守爬虫协议,则可能访问受限。

BOT_NAME = 'BoleParse'
SPIDER_MODULES = ['BoleParse.spiders']
NEWSPIDER_MODULE = 'BoleParse.spiders'
ROBOTSTXT_OBEY = False
CONCURRENT_REQUESTS = 96
CONCURRENT_ITEMS = 200
ITEM_PIPELINES = {'BoleParse.pipelines.BoleparsePipeline': 300
}

3.5 放置持久化文件

saveWebPage文件夹必须和启动cmd时处在相同的文件夹,只有这样才能运行成功。
如下图所示,powershell现在进入的目录是C:\Users\Administrator\Desktop\伯乐\BoleParse,
则saveWebPage文件夹也必须在C:\Users\Administrator\Desktop\伯乐\BoleParse中。
注意:读者的路径与本文不同;运行命令前建议先关闭Pycharm,否则可能卡顿

图片.png-13.6kB
图片.png-13.6kB

3.6 运行结果

程序运行结束后,查询插入数据的总条数,如下图所示:


图片.png-2.1kB
图片.png-2.1kB

数据库表中数据查看如下图所示:


图片.png-117.1kB
图片.png-117.1kB

插入数据总共用时66.51秒,如下图所示:
图片.png-42.9kB
图片.png-42.9kB

3.7 数据库连接池

进行此步骤时需要先把pipelines.py文件中的代码清空,然后把下面的代码插入其中。
数据库连接池方式进行数据库操作效率更高,因为是异步多线程运行,效率提高40%左右。
用twisted.enterprise.adbapi方法初始化一个数据库连接池对象。
该方法需要7个参数,其中dbapiName、cursorclass这2个和数据连接用的库有关,
其他5个参数是数据库连接设置,host、db、user、passwd、charset。
dbpool.runInteraction里面传入的第1个参数是函数对象,后面参数不定长。

from twisted.enterprise import adbapi
import pymysql
import timeclass BoleparsePipeline(object):def __init__(self):params = dict(dbapiName = 'pymysql',cursorclass=pymysql.cursors.DictCursor,host = 'localhost',db = 'bole',user = 'root',passwd = '...your password',charset = 'utf8',)self.dbpool = adbapi.ConnectionPool(**params)self.startTime = time.time()self.dbpool.runInteraction(self.createTable)def createTable(self, cursor):drop_sql = "drop table if exists article"cursor.execute(drop_sql)create_sql = "create table article(id int primary key," \"title varchar(200),publishtime varchar(30)," \"category varchar(30),digest text," \"detailUrl varchar(200),imgUrl varchar(200))" \"default charset = utf8mb4;"cursor.execute(create_sql)def process_item(self, item, spider):self.dbpool.runInteraction(self.insert,item)return itemdef insert(self, cursor, item):try:if len(item['imgUrl']) >= 200:item.pop('imgUrl')fieldStr = ','.join(['`%s`' % k for k in item.keys()])valuesStr = ','.join(['"%s"' % v for v in item.values()])insert_sql = "insert into article(%s) values(%s)" % (fieldStr, valuesStr)cursor.execute(insert_sql)except Exception as e:with open("insert.log",'a+') as file:datetime = time.strftime('%Y-%m-%d %H:%M:%S')logStr = "%s log:插入第%d条数据发生异常\nreason:%s\n"file.write(logStr %(datetime,item['id'],str(e)))def close_spider(self, spider):print("程序总共运行%.2f秒" % (time.time() - self.startTime))

从下图中可以看出插入数据到mysql数据库中总共用时45.18秒
所以使用数据库连接池效率提高66.51/45.18-1=47%

图片.png-41.6kB
图片.png-41.6kB

with open("insert.log",'a+') as file,在日志中一般读写方式使用a+
数据库插入11171条数据,有1条插入数据库失败,查看错误日志:
图片.png-6kB
图片.png-6kB

4.查看数据库缺少条目

先从数据库中取出所有条目的id,赋值给id_list
result = set(id_list)^set(range(1,11173))第20行代码通过2个集合取差集找出缺少的条目。

import pymysqldef getConn(database ="bole"):args = dict(host = 'localhost',user = 'root',passwd = '...your password',charset = 'utf8',db = database)return pymysql.connect(**args)if __name__ == "__main__":conn = getConn()cursor = conn.cursor()sql = "select id from article"cursor.execute(sql)result = cursor.fetchall()id_list = [k[0] for k in result]result = set(id_list)^set(range(1,11173))print(result)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_731454.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2345浏览器网址_火绒安全警报:新型宏病毒通过Excel传播 暗刷2345网站牟利

【快讯】火绒安全团队发出警告,近日,一批新型宏病毒正通过Excel文件传播,该病毒入侵电脑运行后,会悄悄访问带有推广计费名的2345网址暗刷流量,并且还会感染电脑上其它的Excel文件,然后通过这些文件传播给其…

仿站和模板建站的区别_模板建站方式的优缺点,武汉企业公司你知道多少?美咖网络...

网络公司很多,由于技术水平层次不齐,决定了网络公司的建站方式。建站技术水平高,建站方式是个性化定制营销网站,建站技术水平一般,建站方式是仿站或者展示网站,建站技术水平低,建站方式就是套模…

dede服务器建站_网站建设DEDE织梦建站教学:一、织梦建站介绍浅谈

网站建设DEDE织梦建站:一、织梦建站介绍浅谈现在在这个互联网横行的时代,网站建设是很多人需要的,也有很多人想来学习这门技能,其实网站建设的门槛是非常低的,自从出现像DEDE这些模板建站出来后,就算你不会…

html设计响应网站,构建HTML5+响应式设计网站

很多主流的网站我们看到越来越多精致的设备兼容,无论PC,平板还是手机,对于网站的浏览都没有任何视觉上的障碍,不会影响到阅读和点击,尤其是手机端的交互,追求app是的设计也成为网站主所极其关注的&#xff…

通过避免10 个常见 ASP.NET 缺陷使网站平稳运行

本文将讨论: • 缓存和 Forms 身份验证 • 视图状态和会话状态 • 配置文件属性序列化 • 线程池饱和 • 模拟和设置配置文件本文使用了下列技术:.NET Framework、ASP.NET、Windows Server 2003本页内容LoadControl 和输出缓存 会话和输出缓存 Forms 身份…

网站服务器如何移动路线,移动线路云服务器

移动线路云服务器 内容精选换一换在“云服务器列表”页,单击下拉按钮展开会话列表,查看会话连接状态,出现“关闭应用失败”的异常。将鼠标移动至“关闭应用失败”处,查看具体的失败原因,并根据表1进行故障排除。关闭应…

独家整理: 六款高质量的办公资源网站,疯狂提高你的工作效率

工作中经常需要找一些素材,办公中要用到网站的机会也越来越多, 这年头,没几个资源网站怎么能行?今天就给大家分享几款高质量的在线办公资源网站。一:Nicetoolhttp://www.nicetool.netnicetool是一个高质量工具集合网站,强烈安利。…

seo 伪原创_seo伪原创工具(解析新云查新型伪原创模式工具)

现在内容为王,外链为皇的互联网时代大家对文章内容的质量越来越看重,SEOer们在做内容时原创文章内容时最好的,当然伪原创文章也是一大部分SEOer的选择。文章做伪原创的方法有的人是手动做伪原创,而有的人是依靠伪原创工具做伪原创…

手把手教你入侵网站修改数据_手把手教你建立私人数据检索库(二)

原创:青空酱合天智汇原创投稿活动:http://link.zhihu.com/?targethttps%3A//mp.weixin.qq.com/s/Nw2VDyvCpPt_GG5YKTQuUQ---你可曾听过社工库的传说?声明:本文介绍的安全工具仅用于渗透测试及安全教学使用,禁止任何非法用途0x00…

php网站缩略图方案,php生成缩略图填充白边(等比缩略图方案)_PHP

网站上传图片后生成缩略图应该是非常常用的功能了,通常来讲为了网站显示美观,缩略图会是同样尺寸,比如最近笔者做的一个站点,缩略图规格要求都是160120。但是如果上传的图片比例和缩略图不一致,直接缩放的话就会导致图…

苹果手机上linux编程,iOS真机调试 - iOS学习笔记_Linux编程_Linux公社-Linux系统门户网站...

前面一直使用模拟器运行,今天使用了真机调试,这一篇介绍一下真机调试。真机调试需要99$注册,如果有注册过的账号,也可以使用注册账号邀请你加入一个账号下,注册账号可以给你分配权限,我也是使用的邀请成为开…

.net mvc 获取iis基本登录网站登录账号_如何注册Google Analytics账号

一、注册账号网址:https://analytics.google.com打开网址,使用谷歌账号登录。有谷歌账号直接点击sign in to analytics登录即可,没有谷歌账号,要创建账号就点击start for free。二、绑定网站域名,获取跟踪代码点击左下…

seo查询工具源码_想要SEO优化做得好,网站排名查询工具少不了

在如今这个互联网时代,很多企业都在做网站,尤其是那些有业务和产品销售的网站,能够在搜索引擎上排名靠前,是最希望看到的事,而这就需要用到SEO优化这份工作了。当然,做SEO优化并不是那么容易的事&#xff0…

IIS网站服务器性能优化指南[资源下载]

Windows Server自带的互联网信息服务器(Internet Information Server,IIS)是架设网站服务器的常用工具,它是一个既简单而又麻烦的东西,新手都可以使用IIS架设一个像模像样的Web站点来,但配置、优化IIS的性能…

2008R2 WEB服务器的搭建及其网站的制作

第一步:做WEB服务器1.划IP(本机IP192.168.8.135)虚拟机ip(dc1 192.168.8.136)虚拟机ip(dc2192.168.8.137)2.添加角色 web服务在C盘下新建文件夹‘web’ 将论坛的软件拖到web下 并且给web目录设置…

php隐藏后门,PHP网站后门如何做到免杀和隐藏

原标题:PHP网站后门如何做到免杀和隐藏后门当我们拿到一个网站的权限时,都会留下一个后门。方便日后的管理与操作。但是,如果有一天,管理员把我们的后门删除掉了怎么办?!这就用到了我们现在要学的了&#x…

大型网站架构演变和知识体系(1)

之前也有一些介绍大型网站架构演变的文章,例如LiveJournal的、ebay的,都是非常值得参考的,不过感觉他们讲的更多的是每次演变的结果,而没有很详细的讲为什么需要做这样的演变,再加上近来感觉有不少同学都很难明白为什么…

使用网站模板快速建站_网站开发模板制作好不好?模板建站的优缺点介绍

现在建站可以采用模板或者定制开发两种方式,近年来开发技术越来越成熟了,原本不受喜爱的模板开发已渐渐变成主流了,说明它的优点还是蛮多的,不过从它的名字可以看出来缺点也是有不少,下面,​奥晶科技给大家…

web 服务器被配置为不列出此目录的内容。_Kali Linux下Dirb工具web网站目录爆破指南...

在本文中,我们将重点介绍使用Kali Linux工具DIRB的临时目录,并尝试在Web服务器中查找隐藏的文件和目录。一个路径遍历攻击也被称为“目录遍历”目标访问的文件和目录存储在Web根文件夹之外。通过使用带有“ ..”的序列的引用文件及其变体来操纵变量&…

双语网站资源文件

原文链接:http://songwenjie12.blog.163.com/blog/static/131224420200910685249410/ 摘要:随着计算机网络的发展,一些商业机构也开始向国际市场迈进。因此这些商业的机构的网站 也开始面向全世界的用户,要求网站具有多语言的选择…