scrapy框架提升篇

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

1、创建启动爬虫脚本

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

添加代码:

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

2、自动爬取多页

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

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

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

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

  1. import scrapy
  2. from scrapy.spiders import CrawlSpider,Rule #爬取规则
  3. from scrapy.linkextractor import LinkExtractor #提取链接
  4. class MysinaSpider(CrawlSpider):
  5. name = 'mysina'
  6. allowed_domains = ['sina.com.cn']
  7. start_urls = ['http://roll.news.sina.com.cn/news/gnxw/gdxw1/index_1.shtml']
  8. #设置爬取规则,可迭代对象,可设置多个规则
  9. rules = [Rule(LinkExtractor(allow=("index_(\d+).shtml")),callback='get_parse',follow=True)]
  10. def get_parse(self, response):
  11. newsList = response.xpath('//ul[@class="list_009"]/li')
  12. for news in newsList:
  13. # 新闻标题
  14. title = news.xpath('./a/text()').extract()[0]
  15. # 新闻时间
  16. newsTime = news.xpath('./span/text()').extract()[0]
  17. # print('***********',title,'****',newsTime)
  18. #获取正文的url
  19. contentsUrl = news.xpath('./a/@href').extract()[0]
  20. #使用框架自带的Request()构建请求,使用meta传递参数
  21. '''
  22. scrapy.Request()参数列表:
  23. url,
  24. callback=None, 回调函数
  25. meta=None, 数据传递
  26. '''
  27. request = scrapy.Request(url=contentsUrl,callback=self.get_article,)
  28. # 使用meta传递参数 是一个字典, 只能传递一层
  29. request.meta['title'] = title
  30. request.meta['newsTime'] = newsTime
  31. yield request
  32. def get_article(self,response):
  33. contents = response.xpath('//div[@id="article"]//text()')
  34. #新闻内容
  35. newsContent = ""
  36. for content in contents:
  37. newsContent += content.extract().strip()+'\n'
  38. print('*****新闻正文*****',newsContent,'*****新闻正文*****')
  39. item = SinaItem()
  40. # 从meta中获取参数
  41. item['title'] = response.meta['title']
  42. item['newsTime'] = response.meta['newsTime']
  43. item['newsContent'] = newsContent
  44. yield item

4、保存进MySQL数据库模板

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

  1. import pymysql
  2. class TencentPipeline(object):
  3. def __init__(self):
  4. #连接数据库
  5. self.conn = None
  6. #游标
  7. self.cur = None
  8. # 打开爬虫时调用,只调用一次
  9. def open_spider(self,spider):
  10. self.conn = pymysql.connect(host='127.0.0.1',
  11. user='root',
  12. password="123456",
  13. database='tjob', #数据库为tjob
  14. port=3306,
  15. charset='utf8')
  16. self.cur = self.conn.cursor()
  17. def process_item(self, item, spider):
  18. clos,value = zip(*item.items())
  19. sql = "INSERT INTO `%s`(%s) VALUES (%s)" % ('tencentjob', #表名为tencentjob
  20. ','.join(clos),
  21. ','.join(['%s'] * len(value)))
  22. self.cur.execute(sql, value)
  23. self.conn.commit()
  24. return item
  25. def close_spider(self, spider):
  26. self.cur.close()
  27. self.conn.close()

settings.py中要开启

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

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

在middlewares.py中添加:

  1. from scrapy import signals
  2. import random
  3. #ip代理
  4. from scrapy.downloadermiddlewares.httpproxy import HttpProxyMiddleware
  5. #UA代理
  6. from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
  7. from weixinsougou.settings import USER_AGENTS,PROXIES
  8. class RandomUAMiddleware(UserAgentMiddleware):
  9. '''
  10. 随机UA代理,中间件
  11. '''
  12. def process_request(self, request, spider):
  13. '''
  14. 所有的请求都会经过process_request
  15. :param request:请求
  16. :param spider:爬虫名
  17. :return:
  18. '''
  19. ua = random.choice(USER_AGENTS)
  20. request.headers.setdefault("User-Agent", ua)
  21. class RandomIPMiddleware(HttpProxyMiddleware):
  22. '''
  23. 随机IP代理
  24. '''
  25. def process_request(self, request, spider):
  26. proxy = random.choice(PROXIES)
  27. request.meta['proxy'] = 'http://' + proxy['ip_port']
  28. #class RandomCookieMiddleware(CookiesMiddleware):
  29. # '''
  30. # 随机cookie池
  31. # '''
  32. #
  33. # def process_request(self, request, spider):
  34. # cookie = random.choice(COOKIES)
  35. # request.cookies = cookie

在settings.py中添加:

  1. # -*- coding: utf-8 -*-
  2. # Obey robots.txt rules
  3. ROBOTSTXT_OBEY = False
  4. # Disable cookies (enabled by default)
  5. COOKIES_ENABLED = False
  6. # Override the default request headers:
  7. DEFAULT_REQUEST_HEADERS = {
  8. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  9. 'Accept-Language': 'en',
  10. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
  11. }
  12. # Enable or disable downloader middlewares
  13. # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
  14. #启用中间件
  15. DOWNLOADER_MIDDLEWARES = {
  16. # 'weixinsougou.middlewares.WeixinsougouDownloaderMiddleware': 543,
  17. 'weixinsougou.middlewares.RandomUAMiddleware': 543,
  18. 'weixinsougou.middlewares.RandomIPMiddleware': 544,
  19. }
  20. #UA池
  21. USER_AGENTS = [
  22. "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)",
  23. "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)",
  24. "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)",
  25. "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)",
  26. "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
  27. "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
  28. "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
  29. "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
  30. ]
  31. #IP池
  32. PROXIES = [
  33. {'ip_port': '171.38.85.93:8123'},
  34. {'ip_port': '113.67.227.143:8118'},
  35. {'ip_port': '101.236.19.165:8866'},
  36. {'ip_port': '101.236.21.22:8866'},
  37. ]
  38. #cookle池
  39. COOKIES = []
  40. # 默认线程数量 10
  41. REACTOR_THREADPOOL_MAXSIZE = 20
  42. # 并发 默认16
  43. CONCURRENT_REQUESTS = 16
  44. # pipelines同时处理数量 默认100
  45. CONCURRENT_ITEMS = 50
  46. # scrapy 深度爬取,默认0 不做深度限制
  47. DEPTH_LIMIT = 4
  48. # 下载超时
  49. 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. Spark Parquet详解

    Spark - Parquet 概述 Apache Parquet属于Hadoop生态圈的一种新型列式存储格式,既然属于Hadoop生态圈,因此也兼容大多圈内计算框架(Hadoop.Spark),另外 ...

  2. 【typedef】Type definitions 自定义类型

  3. Windows10下JDK8的下载安装与环境变量的配置

    Windows10下JDK8的下载安装与环境变量的配置 下载JDK8(64位) 链接:https://pan.baidu.com/s/10ZMK7NB68kPORZsPOhivog 提取码:agsa ...

  4. Java知识日常收集整理001Java获取变量的数据类型的实现方法

    一.具体情况区分 对于简单类型变量,是无法直接获得变量类型的:要想获取,必须自定义函数进行返回. 对于包装类型变量,是可以直接获得的,变量名称.getClass().getName(); 二.代码实现 ...

  5. error C2065: “uint8_t”: 未声明的标识符

    转载:https://blog.csdn.net/lys07962000/article/details/12052571 参考: http://blog.csdn.net/chenxin_130/a ...

  6. ElasticSearch 索引 VS MySQL 索引

    前言 这段时间在维护产品的搜索功能,每次在管理台看到 elasticsearch 这么高效的查询效率我都很好奇他是如何做到的. 这甚至比在我本地使用 MySQL 通过主键的查询速度还快. 为此我搜索了 ...

  7. Java基础系列-RandomAccess

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755424.html Random是随机的意思,Access是访问的意思,合起来就是随机访问的意思. ...

  8. tuple的增删改查

    dict = {"k1": "v1", "k2": "v2", "k3": "v3&quo ...

  9. shell-的变量-全局变量

    shell变量基础及深入   1. 变量类型 变量可分为两类:环境变量(全局变量)和局部变量. 环境变量也可称为全局变量,可以在创建他们的shell及其派生出来的任意子进程shell中使用.局部变量只 ...

  10. swoole 客户端和服务端不断通信

    server.php <?php class Chat { const HOST = '0.0.0.0';//ip地址 0.0.0.0代表接受所有ip的访问 const PART = 9501; ...