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. Hbuilder MUI 下拉选择与时间选择器

    一. Hbuilder 下拉选择 <link rel="stylesheet" href="../../../assets/mui/css/mui.picker.m ...

  2. 什么是64位和32位internet explorer

    什么是64位和32位internet explorer 如果您使用 64 位版本的 Internet Explorer 时,您会遇到问题,请尝试使用 32 位版本的 Internet Explorer ...

  3. 014 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 08 “字符型”字面值

    014 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 08 "字符型"字面值 字符型 字面值如何表示? 两个关键:单引号(必须是英文单引号). ...

  4. 插头 dp

    插头dp 洛谷 黑题板子? P5056 给出n×m的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路.问有多少种铺法? 1.轮廓线 简单地说,轮廓线就是已决策格子和未决策格子的分界线: 2,插 ...

  5. ==38254==Sanitizer CHECK failed报错解决

    跑代码时发现有如下报错: LeakSanitizer: bad pointer 0x7ffd00735130==38254==Sanitizer CHECK failed: ../../../../l ...

  6. 彻底理解红黑树及JavaJDK1.8TreeMap源码分析

    1. 定义 红黑树也是二叉查找树,我们知道,二叉查找树这一数据结构并不难,而红黑树之所以难是难在它是自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态.红黑树 ...

  7. 白话解析:一致性哈希算法 consistent hashing【转】

    学习一致性哈希算法原理的时候看到博主朱双印的一片文章,看完就懂,大佬! 白话解析:一致性哈希算法 consistent hashing

  8. C# 中 System.Range 结构体

    翻译自 John Demetriou 2020年4月6日 的文章 <C# 8 Is Introducing Ranges> 我们之前讨论过的 C# 中的一个特性 System.Index ...

  9. python框架day01

    一.注意事项 # 如何让你的计算机能够正常的启动django项目 1.计算机的名称不能有中文 2.一个pycharm窗口只开一个项目 3.项目里面所有的文件也尽量不要出现中文 4.python解释器尽 ...

  10. 多Y轴图的尝试

    最近的一篇文章中需要绘制多Y轴图形,Excel只能做双Y轴图,又尝试了Origin,SigmaPlot,Igor等软件,手动做起来相当繁琐,批量做更是觉得费劲,干脆尝试在MeteoInfoLab里实现 ...