案例:

网易新闻的爬取:

https://news.163.com/

爬取的内容为一下4大板块中的新闻内容

爬取:

特点:

动态加载数据  ,用 selenium

爬虫

1. 创建项目

scrapy startproject wy

2. 创建爬虫

scrapy genspider wangyi www.wangyi.com

撰写爬虫

1. 获取板块url

import scrapy

class WangyiSpider(scrapy.Spider):
name = 'wangyi'
# allowed_domains = ['www.wangyi.com']
start_urls = ['https://news.163.com/'] def parse(self, response): # 获取4大板块的url 国内、国际、军事、航空 li_list = response.xpath("//div[@class='ns_area list']/ul/li")
item_list =[]
for li in li_list: url = li.xpath("./a/@href").extract_first()
title = li.xpath('./a/text()').extract_first().strip()
# 过滤出 国内、国际、军事、航空
if title in ['国内','国际','军事','航空']:
item = {}
item['title'] = title
item['url'] = url print(item)

1.过滤出想要板块的url和板块名爬虫

settings.py 文件中:

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

执行爬虫效果

2.  每个板块页面的爬取:

爬虫代码:

 # 提取板块中的数据
def parse_content(self,response): title = response.meta.get('title')
div_list =response.xpath("//div[@class='ndi_main']/div") print(len(div_list))
for div in div_list:
item={}
item['group'] = title
img_url = div.xpath('./a/img/@src').extract_first()
article_url = div.xpath('./a/img/@href').extract_first()
head = div.xpath('./a/img/@alt').extract_first()
keywords = div.xpath('//div[@class="keywords"]//text()').extract()
# 将列表内容转换成字符串
content = "".join([i.strip() for i in keywords])
item['img_url'] = img_url
item['article_url'] = article_url
item['head'] = head
item['keywords'] = keywords yield scrapy.Request(
url=article_url,
callback=self.parse_detail,
meta={'item':copy.deepcopy(item)}
)

启动爬虫时没有打印出结果:

用xpath help 插件检查,发现所写的xpath表达式没有错,说明,该页面的数据可能是动态加载的数据

xpath显示有数据

解决动态数据使用selenium:

scrapy 中使用selenium 爬取步骤:

1. 在爬虫类中,重新构造方法 __init__,和写爬虫结束时关闭浏览器

2. 在下载中间键中

from scrapy.http import HtmlResponse
class WyDownloaderMiddleware(object): def process_request(self, request, spider): return None def process_response(self, request, response, spider):
# 拦截 响应
if request.url in [ 'http://news.163.com/domestic/','http://news.163.com/world/','http://war.163.com/','http://news.163.com/air/']: spider.bro.get(url=request.url)
js = 'window.scrollTo(0,document.body.scrollHeight)'
spider.bro.execute_script(js)
time.sleep(3)
page_text=spider.bro.page_source
return HtmlResponse(url=spider.bro.current_url,body=page_text,encoding='utf-8') else: return response

3. settings.py中,开启下载中间件

# See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
'wy.middlewares.WyDownloaderMiddleware': 300,
}

UA池

1.在中间中自定义一个user_agent 中间件类 ,继承UserAgentMiddleware

#单独给UA池封装一个 下载中间件的类
# 需要导包 userAgentMiddleware
class RandomUserAgent(UserAgentMiddleware):
'''
UA池类
# 用faker 模块进行随机生成一个user_agent '''
def process_request(self, request, spider):
fake = Factory.create()
# 通过 faker模块随机生成一个ua
user_agent = fake.user_agent() request.headers.setdefault('User_Agent',user_agent)

2. 在settings.py 配置文件中:

DOWNLOADER_MIDDLEWARES = {
'wy.middlewares.WyDownloaderMiddleware': 300,
'wy.middlewares.RandomUserAgent': 543,
}

IP池

http://www.goubanjia.com/

1. 中间件中:

# 批量对拦截到的请求对ip 进行更换 ,自定义一个ip代理类

class Proxy(object):

    def process_request(self,request,spider):

        # 两种 ip 池
proxy_http=['206.189.231.239:8080','66.42.116.151:8080']
proxy_https=['113.140.1.82:53281','36.79.152.0:8080']
# request.url 返回值 :http://www.xxx.com 或 https://www.xxx.com
h = request.url.split(":")[0] if h=="http:":
ip = random.choices(proxy_http)
request.meta['proxy']='http://'+ip
else:
ip = random.choices(proxy_https)
request.meta['proxy'] = 'https://'+ip

2. settings.py 配置

DOWNLOADER_MIDDLEWARES = {
'wy.middlewares.WyDownloaderMiddleware': 543,
'wy.middlewares.RandomUserAgent': 542,
'wy.middlewares.Proxy': 541,
}

改为分布式爬虫

1.  redis 配置文件redis.conf 进行修改

注释该行:#bind 127.0.0.1,表示可以让其他ip访问

将yes该为no:protected-mode no,表示可以让其他ip操作redis

2. 对爬虫进行修改

将爬虫类的父类修改成基于RedisSpider或者RedisCrawlSpider。注意:如果原始爬虫文件是基于Spider的,则应该将父类修改成RedisSpider,如果原始爬虫文件是基于CrawlSpider的,则应该将其父类修改成RedisCrawlSpider。

- 注释或者删除start_urls列表,切加入redis_key属性,属性值为scrpy-redis组件中调度器队列的名称

3.  在配置文件中进行相关配置,开启使用scrapy-redis组件中封装好的管道

 ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline':  }

4. 在配置文件中进行相关配置,开启使用scrapy-redis组件中封装好的调度器

# 使用scrapy-redis组件的去重队列
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 是否允许暂停
SCHEDULER_PERSIST = True

5.在配置文件中进行爬虫程序链接redis的配置

REDIS_HOST = 'redis服务的ip地址'
REDIS_PORT = 6379
REDIS_ENCODING = ‘utf-8’
#REDIS_PARAMS = {‘password’:’123456’} # 有密码就需要写

6 开启redis服务器:redis-server 配置文件

7开启redis客户端:redis-cli

8 运行爬虫文件:

scrapy crawl wangyi

9 向调度器队列中扔入一个起始url(在redis客户端中操作):lpush redis_key属性值 起始url

selenium、UA池、ip池、scrapy-redis的综合应用案例的更多相关文章

  1. UA池 代理IP池 scrapy的下载中间件

    # 一些概念 - 在scrapy中如何给所有的请求对象尽可能多的设置不一样的请求载体身份标识 - UA池,process_request(request) - 在scrapy中如何给发生异常的请求设置 ...

  2. scrapy版本爬取某网站,加入了ua池,ip池,不限速不封号,100个线程爬崩网站

    目录 scrapy版本爬取妹子图 关键所在下载图片 前期准备 代理ip池 UserAgent池 middlewares中间件(破解反爬) settings配置 正题 爬虫 保存下载图片 scrapy版 ...

  3. 在Scrapy中使用IP池或用户代理更新版(python3)

    middlewares.py # -*- coding: utf-8 -*- # 导入随机模块 import random # 导入有关IP池有关的模块 from scrapy.downloaderm ...

  4. 在Scrapy中使用IP池或用户代理(python3)

    一.创建Scrapy工程 scrapy startproject 工程名 二.进入工程目录,根据爬虫模板生成爬虫文件 scrapy genspider -l # 查看可用模板 scrapy gensp ...

  5. Python爬虫代理IP池

    目录[-] 1.问题 2.代理池设计 3.代码模块 4.安装 5.使用 6.最后 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代 ...

  6. java爬虫进阶 —— ip池使用,iframe嵌套,异步访问破解

    写之前稍微说一下我对爬与反爬关系的理解 一.什么是爬虫      爬虫英文是splider,也就是蜘蛛的意思,web网络爬虫系统的功能是下载网页数据,进行所需数据的采集.主体也就是根据开始的超链接,下 ...

  7. springboot实现java代理IP池 Proxy Pool,提供可用率达到95%以上的代理IP

    一.背景 前段时间,写java爬虫来爬网易云音乐的评论.不料,爬了一段时间后ip被封禁了.由此,想到了使用ip代理,但是找了很多的ip代理网站,很少有可以用的代理ip.于是,抱着边学习的心态,自己开发 ...

  8. 自己设计代理IP池

    大体思路 使用redis作为队列,买了一份蘑菇代理,但是这个代理每5秒可以请求一次,我们将IP请求出来,从redis列表队列的左侧插入,要用的时候再从右侧取出,请求成功证明该IP是可用的,将该代理IP ...

  9. 封装IP池和用户代理相应的类(python3)

    一.middlewares.py源代码: # -*- coding: utf-8 -*- # 导入随机模块 import random # 导入有关IP池有关的模块 from scrapy.contr ...

随机推荐

  1. Js数组去重方法总结

    //方法一 var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5]; function removeDuplicatedItem(arr) { for(var i = 0; ...

  2. 命名空间"xx"已经包含了"xx"的定义

    例: namespace A.B {    public class C    {             } } 注:重名的不仅仅是类,还可以结构,枚举,命名空间本身也有可能重复. 这个类C若与命名 ...

  3. 腾讯笔试编程题,贪吃的小Q(二分查找)

    问题描述 小Q的父母要出差N天,走之前给小Q留下了M块巧克力.小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力. 输入描 ...

  4. Gvim:unable to load python

    环境 系统win7 64 bit 软件: Gvim8.1 : MS-Windows 32bit 软件: python2.7.14 windows 64bit 问题 点击打开Gvim时,提示:unabl ...

  5. mysqlworkbench访问远程服务器

    1.如果服务器有防火墙,需要关一下: systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service # ...

  6. 关于CSS中的定位使用子绝父相(子类绝对位置和父类相对位置)

    关于CSS中的定位使用子绝父相(子类绝对位置和父类相对位置) 欢迎转发,但是请填写原博客地址https://www.cnblogs.com/JNovice/p/9536910.html  前言:最近在 ...

  7. tab切换的效果——仿照今日头条APP的切换效果

    说点废话;不知道是哪一版本起头条的tab切换效果就变了,一直琢磨着这个事,去度娘那里也没有什么结果:正好这两天有空就尝试做了一下:用前端的技术来实现: 先看效果吧:上面的tab随着slide滑动,上面 ...

  8. IDEA Failed to load dx.jar

    IDEA-177053 Android app crashes on build "Failed to load dx.jar" Error:Android Pre Dex: [c ...

  9. Sublime报错

    Sublime出现 unable to read project的错误对话框 每次重新开启都会弹出对话框 解决办法: 1.关闭Sublime 2.C:\Users\Administrator\AppD ...

  10. my work

    Dad, what's your first job? How did you achieved?