那些高手

爬虫好文

而我避免这些问题的方式,控制台清除所有定时

 var id = setInterval(function() {}, 0);
while (id--) clearInterval(id); $(articleSelector).css('height', 'initial')
$(articleSelector).removeClass('lock')
$('#locker').css('display', 'none')

python 运行 js 脚本

pip install PyExecJS

eleme.js

function getParam(){
return 'hello world!'
} xxx.py import execjs import os os.environ["EXECJS_RUNTIME"] = "PhantomJS"
node = execjs.get()
file = 'eleme.js'
ctx = node.compile(open(file).read())
js_encode = 'getParam()'
params = ctx.eval(js_encode)
print(params)

python 包管理

virtualenv virtualwrapper pipenv pyenv --》 conda

步骤

1. pipenv shell
2. pip install scrapy
3. scrapy shell # 可以做 简单调试
3. scrapy startproject videospider # 生成 基本骨架
4. scrapy genspider jobbole www.jobbole.com
5. 取巧 构造一个 main.py 用来在 IDE 里调试

爬虫中 url 去重

set 去重 是 非常占用内存的
md5 信息摘要 算法 之后会省很多, 但是仍然不如 bitmap 方式 bitmap 会 很容易 造成 hash 冲突 bloom filter 这一种 可以通过 hash 函数 减少 hash 冲突 简而言之 言而简之 urls --> set(urls) --> set(md5(url) s) --> bitmap( xxx ) --> bloom filter( multi_hash_func ( xxx ))

下面这个教程要看评论再说。。。坑哭了

https://blog.csdn.net/chenvast/article/details/79103288

爬取 cnblog 文章 练手

# 使用 pipenv 管理环境
mkdir spiders
cd spiders
pipenv install pip install scrapy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com # 利用 模板生成 项目基本样子 类似于 springboot
scrapy startproject ArticleSpider # 爬取 二级域名下的 文章
cd xxx\ArticleSpider\ArticleSpider\spiders\
scrapy genspider cnblog news.cnblogs.com # 修改 settings.py 中 的 爬虫配置 ROBOTSTXT_OBEY 为 False
ROBOTSTXT_OBEY = False # 打开 编辑自动生成的 spider/cnblog.py
# -*- coding: utf-8 -*-
import scrapy
import re
from ArticleSpider.items import ArticleItem
from ArticleSpider.utils.utils import get_md5
from scrapy.http import Request
from urllib import parse class CnblogSpider(scrapy.Spider):
name = 'cnblog'
allowed_domains = ['news.cnblogs.com']
start_urls = ['http://news.cnblogs.com/'] def parse(self, response):
news_selector_list = response.xpath('//div[@id="news_list"]/div[@class="news_block"]')
for news_selector in news_selector_list:
content = news_selector.xpath('div[@class="content"]')
anchor = content.xpath('h2/a')
article_url = anchor.xpath('@href').extract()[0]
article_title = anchor.xpath("text()").extract()[0]
article_front_image_url = content.xpath('div[@class="entry_summary"]/a/@href').extract()[0]
footer = content.xpath('div[@class="entry_footer"]')
article_author = footer.xpath('a/text()').extract()[0]
matched = re.match('评论\((\d+)\)', footer.xpath('span[@class="comment"]/a/text()').extract()[0])
article_comments = matched.group(1) if matched else 0
article_view = footer.xpath('span[@class="view"]').extract()[0]
article_tag = footer.xpath('span[@class="tag"]').extract()[0] article_item = ArticleItem()
article_item['article_url'] = article_url
article_item['article_title'] = article_title
article_item['article_front_image_url'] = article_front_image_url
article_item['article_author'] = article_author
article_item['article_comments'] = article_comments
article_item['article_view'] = article_view
article_item['article_tag'] = article_tag
article_item['article_id'] = get_md5(article_url)
yield Request(url=parse.urljoin(response.url ,article_url),meta={"item":article_item}, callback=self.parse_detail)
pass def parse_detail(self, response):
pass # 有些时候 我们可以使用 Itemloader 来让我们的代码变得更友好
item_loadder = ItemLoader(item=ArticleItem(), response=response)
item_loadder.add_xpath(field_name="article_url", xpath="//div[@id='news_list']/div[@class='news_block']/div[@class='content']/h2/a/@href")
.
.
.
next_urls_selector = response.xpath('//*[@id="sideleft"]/div[5]/a[11]')

总结 对付反爬

访问 500  一般是 UA 没设置
cookie 携带
token
salt
sign
ctrl + shift + f 很好用 在查找 js 调用时候
cookies 池
ip 代理 池 pip3 install faker https://cmder.net/

搭建自己的 ip 代理池

mongo db 安装使用

# 创建 ipproxy 数据库  如果没有就创建
use ipproxy; ### 插入数据
db.ipproxy.insert({"ip_port":"192.168.0.18:5678"}) # 删除 数据库
db.dropDatabase() # 删除集合
db.collection.drop() # 查询集合
db.ipproxy.find().pretty() db.createCollection("mycol", { capped : true, autoIndexId : true, size :
6142800, max : 10000 } ) db.ipproxy.drop()

大型分布式爬虫准备 scrapy + request的更多相关文章

  1. scrapy 分布式爬虫- RedisSpider

    爬去当当书籍信息 多台机器同时爬取,共用一个redis记录 scrapy_redis 带爬取的request对象储存在redis中,每台机器读取request对象并删除记录,经行爬取.实现分布式爬虫 ...

  2. scrapy分布式爬虫scrapy_redis二篇

    =============================================================== Scrapy-Redis分布式爬虫框架 ================ ...

  3. scrapy分布式爬虫scrapy_redis一篇

    分布式爬虫原理 首先我们来看一下scrapy的单机架构:     可以看到,scrapy单机模式,通过一个scrapy引擎通过一个调度器,将Requests队列中的request请求发给下载器,进行页 ...

  4. 第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

    第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time ...

  5. 第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能

    第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...

  6. 第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能

    第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.e ...

  7. 第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中

    第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详 ...

  8. 第三百五十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—利用开源的scrapy-redis编写分布式爬虫代码

    第三百五十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—利用开源的scrapy-redis编写分布式爬虫代码 scrapy-redis是一个可以scrapy结合redis搭建分布式爬虫的开 ...

  9. 第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解

    第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解 信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行 ...

随机推荐

  1. Android应用开发编译框架流程与IDE及Gradle概要

    1 背景 建议阅读本文之前先阅读<Android Studio入门到精通>和<Groovy脚本基础全攻略>及<Gradle脚本基础全攻略>三篇博客作为背景知识,这样 ...

  2. fiddler过滤指定的请求

    需要过滤的请求如图: 设置过滤: 正则表达式(REGEX:\.(js|css|google|favicon\?.*)+)

  3. linux之磁盘管理,网络,计时任务

    磁盘管理 查看磁盘空间的占用 df # 磁盘占有率 -h # 以人类易读的方式展示 Linux下磁盘命名格式:/dev/sda 查看目录的占用空间 /dev/sd[a-z]num总大小 linux下磁 ...

  4. ApiDoc 后端接口注释文档的使用

    前端和后端注释文档生成 前端和后端的 函数及api 说明文档生成总结,持续更新中 by Qzx 参考网址 jsDoc - 中文说明 jsDoc 使用教程 后台接口文档生成器 - APIDOC官网 ap ...

  5. 对js原型对象、实例化对象及prototype属性的一些见解

    什么是原型对象? 请看下面的代码,我们以各种姿势,创建了几个方法! function fn1() { } var fn2 = function () { } var fn3 = new Functio ...

  6. Day03:日期操作 / 集合框架(上)

    日期操作 Java中的时间 · Java中的时间使用标准类库的Date类表示,是用距离一个固定时间点的毫秒数(可正可负,long类型)表达一个特定的时间点: · 固定的时间点叫纪元(epoch),是U ...

  7. redhat网卡设置

    在终端中输入:vi /etc/sysconfig/network-scripts/ifcfg-eth0   开始编辑,填写ip地址.子网掩码.网关.DNS等.其中“红框内的信息”是必须得有的.   编 ...

  8. @Validated和@Valid校验参数、级联属性、List

    @Validated和@Valid的区别 在Controller中校验方法参数时,使用@Valid和@Validated并无特殊差异(若不需要分组校验的话): @Valid:标准JSR-303规范的标 ...

  9. 461. 汉明距离(Hamming Distance)leetcode

    首先附上题目链接: https://leetcode-cn.com/problems/hamming-distance/ 一:题目 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目. ...

  10. Python pip升级及升级失败解决方案

    本教程用于Python  pip升级及失败解决方案 首先查看脚本 pip show pip 我已经升级到了最新的版本 安装其他模块过程中出现下面提示,便说明你需要升级pip You are using ...