scrapy框架提升篇

关注公众号“轻松学编程”了解更多

1、创建启动爬虫脚本

在项目目录下创建start.py文件:

添加代码:

#以后只要运行start.py就可以启动爬虫
import scrapy.cmdline def main():
#mytencent为当前项目爬虫名
scrapy.cmdline.execute(['scrapy', 'crawl', 'mytencent']) if __name__ == '__main__':
main()

2、自动爬取多页

在spiders文件夹下的mytencent.py中MytencentSpider类要继承CrawlSpider,然后添加规则即可:

import scrapy
from tencent.items import TencentItem from scrapy.spiders import CrawlSpider, Rule # 爬取规则
from scrapy.linkextractors import LinkExtractor # 提取链接 #爬虫类继承CrawlSpider
class MytencentSpider(CrawlSpider):
name = 'mytencent'
allowed_domains = ['hr.tencent.com']
start_urls = ['https://hr.tencent.com/position.php?keywords=&tid=0&start=10#a'] #添加爬取url规则,url符合正则start=(\d+)#a")就爬取
rules = (Rule(LinkExtractor(allow=("start=(\d+)#a")), callback='get_parse', follow=True),) # 一定不能用parse()
def get_parse(self, response):
jobList = response.xpath('//tr[@class="even"] | //tr[@class="odd"]') # 存储对象
item = TencentItem() for job in jobList:
# .extract()提取文本
jobName = job.xpath('./td[1]/a/text()').extract()[0]
jobType = job.xpath('./td[2]/text()').extract()[0]
item['jobName'] = jobName
item['jobType'] = jobType yield item

3、使用框架自带的Request()构建请求

在spiders文件夹下的mysina.py中:

import scrapy
from scrapy.spiders import CrawlSpider,Rule #爬取规则
from scrapy.linkextractor import LinkExtractor #提取链接 class MysinaSpider(CrawlSpider):
name = 'mysina'
allowed_domains = ['sina.com.cn']
start_urls = ['http://roll.news.sina.com.cn/news/gnxw/gdxw1/index_1.shtml']
#设置爬取规则,可迭代对象,可设置多个规则
rules = [Rule(LinkExtractor(allow=("index_(\d+).shtml")),callback='get_parse',follow=True)] def get_parse(self, response):
newsList = response.xpath('//ul[@class="list_009"]/li')
for news in newsList:
# 新闻标题
title = news.xpath('./a/text()').extract()[0]
# 新闻时间
newsTime = news.xpath('./span/text()').extract()[0]
# print('***********',title,'****',newsTime)
#获取正文的url
contentsUrl = news.xpath('./a/@href').extract()[0]
#使用框架自带的Request()构建请求,使用meta传递参数
'''
scrapy.Request()参数列表:
url,
callback=None, 回调函数
meta=None, 数据传递
'''
request = scrapy.Request(url=contentsUrl,callback=self.get_article,)
# 使用meta传递参数 是一个字典, 只能传递一层
request.meta['title'] = title
request.meta['newsTime'] = newsTime yield request def get_article(self,response):
contents = response.xpath('//div[@id="article"]//text()')
#新闻内容
newsContent = ""
for content in contents:
newsContent += content.extract().strip()+'\n'
print('*****新闻正文*****',newsContent,'*****新闻正文*****')
item = SinaItem()
# 从meta中获取参数
item['title'] = response.meta['title']
item['newsTime'] = response.meta['newsTime'] item['newsContent'] = newsContent yield item

4、保存进MySQL数据库模板

在MySQL中建立数据库,表,然后在pipelines.py中编写代码如下:

import pymysql

class TencentPipeline(object):
def __init__(self):
#连接数据库
self.conn = None
#游标
self.cur = None # 打开爬虫时调用,只调用一次
def open_spider(self,spider):
self.conn = pymysql.connect(host='127.0.0.1',
user='root',
password="123456",
database='tjob', #数据库为tjob
port=3306,
charset='utf8')
self.cur = self.conn.cursor() def process_item(self, item, spider):
clos,value = zip(*item.items())
sql = "INSERT INTO `%s`(%s) VALUES (%s)" % ('tencentjob', #表名为tencentjob
','.join(clos),
','.join(['%s'] * len(value))) self.cur.execute(sql, value) self.conn.commit()
return item def close_spider(self, spider):
self.cur.close()
self.conn.close()

settings.py中要开启

ITEM_PIPELINES = {
'tencent.pipelines.TencentPipeline': 300,
}

5、使用中间件做UA代理,IP代理

在middlewares.py中添加:

from scrapy import signals
import random #ip代理
from scrapy.downloadermiddlewares.httpproxy import HttpProxyMiddleware
#UA代理
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware from weixinsougou.settings import USER_AGENTS,PROXIES class RandomUAMiddleware(UserAgentMiddleware):
'''
随机UA代理,中间件
'''
def process_request(self, request, spider):
'''
所有的请求都会经过process_request
:param request:请求
:param spider:爬虫名
:return:
'''
ua = random.choice(USER_AGENTS)
request.headers.setdefault("User-Agent", ua) class RandomIPMiddleware(HttpProxyMiddleware):
'''
随机IP代理
''' def process_request(self, request, spider):
proxy = random.choice(PROXIES)
request.meta['proxy'] = 'http://' + proxy['ip_port'] #class RandomCookieMiddleware(CookiesMiddleware):
# '''
# 随机cookie池
# '''
#
# def process_request(self, request, spider):
# cookie = random.choice(COOKIES)
# request.cookies = cookie

在settings.py中添加:

# -*- coding: utf-8 -*-

# Obey robots.txt rules
ROBOTSTXT_OBEY = False # Disable cookies (enabled by default)
COOKIES_ENABLED = False # Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
} # Enable or disable downloader middlewares
# See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
#启用中间件
DOWNLOADER_MIDDLEWARES = {
# 'weixinsougou.middlewares.WeixinsougouDownloaderMiddleware': 543,
'weixinsougou.middlewares.RandomUAMiddleware': 543,
'weixinsougou.middlewares.RandomIPMiddleware': 544, } #UA池
USER_AGENTS = [
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
] #IP池
PROXIES = [
{'ip_port': '171.38.85.93:8123'},
{'ip_port': '113.67.227.143:8118'},
{'ip_port': '101.236.19.165:8866'},
{'ip_port': '101.236.21.22:8866'},
] #cookle池
COOKIES = [] # 默认线程数量 10
REACTOR_THREADPOOL_MAXSIZE = 20 # 并发 默认16
CONCURRENT_REQUESTS = 16 # pipelines同时处理数量 默认100
CONCURRENT_ITEMS = 50 # scrapy 深度爬取,默认0 不做深度限制
DEPTH_LIMIT = 4
# 下载超时
DOWNLOAD_TIMEOUT = 180

#####6、使用redis实现分布式爬取

https://blog.csdn.net/lm_is_dc/article/details/81866275

#####7、部署

https://blog.csdn.net/lm_is_dc/article/details/81869508

8、使用gerapy管理爬虫

https://blog.csdn.net/lm_is_dc/article/details/81869508

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

python爬虫使用scrapy框架的更多相关文章

  1. Python爬虫进阶(Scrapy框架爬虫)

    准备工作:           配置环境问题什么的我昨天已经写了,那么今天直接安装三个库                        首先第一步:                           ...

  2. python爬虫随笔-scrapy框架(1)——scrapy框架的安装和结构介绍

    scrapy框架简介 Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试 ...

  3. python爬虫之scrapy框架介绍

    一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等) ...

  4. python爬虫之scrapy框架

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...

  5. python爬虫之Scrapy框架(CrawlSpider)

    提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬去进行实现的(Request模块回调) 方法二:基于CrawlSpi ...

  6. (转)python爬虫----(scrapy框架提高(1),自定义Request爬取)

    摘要 之前一直使用默认的parse入口,以及SgmlLinkExtractor自动抓取url.但是一般使用的时候都是需要自己写具体的url抓取函数的. python 爬虫 scrapy scrapy提 ...

  7. Python 爬虫之Scrapy框架

    Scrapy框架架构 Scrapy框架介绍: 写一个爬虫,需要做很多的事情.比如:发送网络请求.数据解析.数据存储.反反爬虫机制(更换ip代理.设置请求头等).异步请求等.这些工作如果每次都要自己从零 ...

  8. python爬虫中scrapy框架是否安装成功及简单创建

    判断框架是否安装成功,在新建的爬虫文件夹下打开盘符中框输入cmd,在命令中输入scrapy,若显示如下图所示,则说明成功安装爬虫框架: 查看当前版本:在刚刚打开的命令框内输入scrapy versio ...

  9. Python网络爬虫之Scrapy框架(CrawlSpider)

    目录 Python网络爬虫之Scrapy框架(CrawlSpider) CrawlSpider使用 爬取糗事百科糗图板块的所有页码数据 Python网络爬虫之Scrapy框架(CrawlSpider) ...

随机推荐

  1. Python-变量-字符串

    str 字符串如何表示字符串? 单行 单引号 '' 如果字符串中有单引号就需要双引号表示,反之亦然 双引号 " " 换行表示 \ one_str = "简洁胜于优雅&qu ...

  2. selenium3介绍

    1.  简介 Selenium是用于测试 Web应用程序用户界面 (UI)的常用框架.它是一款用于运行端到端功能测试的超强工具.您可以使用多个编程语言编写测试,并且 Selenium能够在一个或多个浏 ...

  3. C\C++中计时、延时函数

    转载:https://blog.csdn.net/keith_bb/article/details/53055380 C\C++标准库中提供了两种计时函数clock()和time().其用法如下:(1 ...

  4. c++ 中. 和 ->,波浪号 ~ 符号怎么用 ————很重要

    参考:https://www.cnblogs.com/Simulation-Campus/p/8809999.html 1.  用在类中的析构函数之前,表示该函数是析构函数.如类A的析构函数 clas ...

  5. Eclipse 设置Tab键为4个空格

    参考:java编程规范之eclipse设置tab键为四个空格 Eclipse版本 1.点击菜单Window > Preference 2.在Preferences窗口中,展开General &g ...

  6. LiteOS-任务篇

    目录 前言 链接 参考 笔录草稿 基本概念 任务相关概念 LiteOS 任务运作机制 内核初始化 创建任务 创建任务有两种方案 任务相关函数 任务开发流程 创建创建任务 部分源码 例子 创建任务的任务 ...

  7. AD(Altium Designer)PCB布线中的“格式刷”,助力快速布局布线

    摘要:在AD(Altium Designer)进行电路板布线时,孔丙火(微信公众号:孔丙火)经常会碰到电路中有相同功能的模块,比如2路相同的RS485通信电路.多路相同继电器输出电路.多路相同的输入电 ...

  8. 介绍使用Cordova和Web Starter Kit开发Android

    介绍 如今,每个人都想制作移动应用程序,为什么不呢?世界上有更多的移动设备比任何其他用户设备.Android尤其流行,但是为什么不从一个众所周知的跨平台应用的基础开始呢?Android的开发显然比其他 ...

  9. Semaphore最详细解析

    官方解释: 一个计数信号量.在概念上,信号量维持一组许可证.如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它.每个release()添加许可证,潜在地释放阻塞获取方.但是,没 ...

  10. CDH5部署三部曲之二:部署和设置

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...